pax_global_header00006660000000000000000000000064126220765310014516gustar00rootroot0000000000000052 comment=1544f842428047bf041976b0f677985fa7b87033 virtualbricks-1.0.2/000077500000000000000000000000001262207653100144025ustar00rootroot00000000000000virtualbricks-1.0.2/COPYING000066400000000000000000000020121262207653100154300ustar00rootroot00000000000000Virtualbricks is copyright 2011 by Daniele Lacamera, Rainer Haage and the Virtualbricks development team. Virtualbricks development team: Daniele Lacamera, Francesco Apollonio, Simone Abbati, Pierre-Louis Bonicoli, Rainer Haage, Fabio Viola. All the software in this directory and in all the subdirectories is licensed under the terms of GNU GPL v.2, http://www.gnu.org/licenses/gpl-2.0.html unless stated differently. All the icons are created by Fabio Viola and released under the terms of CC BY-NC-SA v.3 (http://creativecommons.org/licenses/by-nc-sa/3.0/) - Icons 'Connect' and 'Disconnect' are fairly based on 'plug' icon created by cablout (http://openclipart.org/user-detail/caboulot) (Public Domain) - Icons 'Wire' and 'Wirefilter' are fairly based on 'tango network wired' icon created by warszawianka (http://openclipart.org/user-detail/warszawianka) (Public+Domain) - Icon 'Event' is fairly based on 'tango appointment new' icon created by warszawianka (http://openclipart.org/user-detail/warszawianka) (Public Domain) virtualbricks-1.0.2/PKG-INFO000066400000000000000000000006341262207653100155020ustar00rootroot00000000000000Metadata-Version: 1.1 Name: virtualbricks Version: 1.0.2 Summary: Virtualbricks Virtualization Tools Home-page: http://www.virtualbricks.eu/ Author: Daniele Lacamera, Rainer Haage, Francesco Apollonio, Pierre-Louis Bonicoli, Simone Abbati Author-email: qemulator-list@createweb.de License: GPLv2 Description: UNKNOWN Platform: linux2 Platform: linux Requires: twisted (>=12.0.0) Requires: zope.interface (>=3.5) virtualbricks-1.0.2/bin/000077500000000000000000000000001262207653100151525ustar00rootroot00000000000000virtualbricks-1.0.2/bin/virtualbricks000077500000000000000000000016061262207653100177670ustar00rootroot00000000000000#!/usr/bin/env python # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from virtualbricks.scripts import virtualbricks virtualbricks.run() virtualbricks-1.0.2/l10nextract.sh000077500000000000000000000005571262207653100171150ustar00rootroot00000000000000COMMONS="--package-name=virtualbricks --package-version=1.0 --msgid-bugs-address=qemulator-list@createweb.de" JOIN="-j" LANGUAGES="it nl es fr de" SOURCES="share/*.glade `find virtualbricks/ -type f`" xgettext -plocale/virtualbricks -ovirtualbricks.pot $COMMONS $SOURCES for l in $LANGUAGES; do xgettext -plocale/virtualbricks -o$l.po $JOIN $COMMONS $SOURCES; done virtualbricks-1.0.2/locale/000077500000000000000000000000001262207653100156415ustar00rootroot00000000000000virtualbricks-1.0.2/locale/virtualbricks/000077500000000000000000000000001262207653100205255ustar00rootroot00000000000000virtualbricks-1.0.2/locale/virtualbricks/de.po000066400000000000000000003244251262207653100214670ustar00rootroot00000000000000# 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 , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: virtualbricks 0.4\n" "Report-Msgid-Bugs-To: qemulator-list@createweb.de\n" "POT-Creation-Date: 2011-06-01 22:47+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: share/virtualbricks.template.glade:10 msgid "Virtualbricks" msgstr "" #: share/virtualbricks.template.glade:27 msgid "_File" msgstr "" #: share/virtualbricks.template.glade:33 msgid "_Open Project" msgstr "" #: share/virtualbricks.template.glade:48 msgid "_Recent Projects..." msgstr "" #: share/virtualbricks.template.glade:68 msgid "Restart with _empty project" msgstr "" #: share/virtualbricks.template.glade:83 msgid "_Import bricks" msgstr "" #: share/virtualbricks.template.glade:98 msgid "_Save project as..." msgstr "" #: share/virtualbricks.template.glade:132 msgid "_Settings" msgstr "" #: share/virtualbricks.template.glade:140 msgid "configure Virtualbricks" msgstr "" #: share/virtualbricks.template.glade:150 msgid "auto show empty settings" msgstr "" #: share/virtualbricks.template.glade:159 msgid "auto hide stored settings" msgstr "" #: share/virtualbricks.template.glade:171 msgid "_View" msgstr "" #: share/virtualbricks.template.glade:179 msgid "_Messages" msgstr "" #: share/virtualbricks.template.glade:191 msgid "_Image creation" msgstr "" #: share/virtualbricks.template.glade:198 msgid "Not implemented yet" msgstr "" #: share/virtualbricks.template.glade:199 msgid "_Create new image" msgstr "" #: share/virtualbricks.template.glade:211 msgid "_Help" msgstr "" #: share/virtualbricks.template.glade:218 msgid "About Virtualbricks and QEMU" msgstr "" #: share/virtualbricks.template.glade:219 msgid "_About" msgstr "" #: share/virtualbricks.template.glade:271 msgid "Bricks:" msgstr "" #: share/virtualbricks.template.glade:298 msgid "New Brick" msgstr "" #: share/virtualbricks.template.glade:320 msgid "Start All Bricks" msgstr "" #: share/virtualbricks.template.glade:334 msgid "Stop All Bricks" msgstr "" #: share/virtualbricks.template.glade:361 msgid "" "You can use drag and drop to connect bricks and double click to start/stop " "them." msgstr "" #: share/virtualbricks.template.glade:378 virtualbricks/gui/gui.py:115 msgid "Bricks" msgstr "" #: share/virtualbricks.template.glade:396 msgid "New Event" msgstr "" #: share/virtualbricks.template.glade:418 msgid "Start All Events" msgstr "" #: share/virtualbricks.template.glade:432 msgid "Stop All Events" msgstr "" #: share/virtualbricks.template.glade:459 msgid "" "You can use drag and drop to add an event to events collation and double " "click to start/stop them." msgstr "" #: share/virtualbricks.template.glade:477 msgid "Events" msgstr "" #: share/virtualbricks.template.glade:494 msgid "" "Click to select an enty for use or edit its configuration, rightclick for " "more." msgstr "" #: share/virtualbricks.template.glade:508 msgid "Running" msgstr "" #: share/virtualbricks.template.glade:526 msgid "Add host:" msgstr "" #: share/virtualbricks.template.glade:601 msgid "Remote Sessions" msgstr "" #: share/virtualbricks.template.glade:637 msgid "Export as Image" msgstr "" #: share/virtualbricks.template.glade:653 msgid "Expand Horizontally" msgstr "" #: share/virtualbricks.template.glade:668 msgid "Expand Vertically" msgstr "" #: share/virtualbricks.template.glade:725 msgid "Topology" msgstr "" #: share/virtualbricks.template.glade:744 msgid "Show/hide configuration panel for selected boot image" msgstr "" #: share/virtualbricks.template.glade:769 msgid "Show settings" msgstr "" #: share/virtualbricks.template.glade:839 msgid "boot as device" msgstr "" #: share/virtualbricks.template.glade:871 msgid "Snapshot mode" msgstr "" #: share/virtualbricks.template.glade:876 msgid "write to temporary files instead of disk image files" msgstr "" #: share/virtualbricks.template.glade:902 msgid "boot options" msgstr "" #: share/virtualbricks.template.glade:931 msgid "use image as cdrom" msgstr "" #: share/virtualbricks.template.glade:936 msgid "use one of the image files in the default folder as cdrom device" msgstr "" #: share/virtualbricks.template.glade:951 msgid "mount cdrom" msgstr "" #: share/virtualbricks.template.glade:956 msgid "mount local cdrom Drive" msgstr "" #: share/virtualbricks.template.glade:970 msgid "no cdrom" msgstr "" #: share/virtualbricks.template.glade:975 msgid "don´t use any cdrom device" msgstr "" #: share/virtualbricks.template.glade:990 msgid "/dev/cdrom\n" msgstr "" #: share/virtualbricks.template.glade:1062 msgid "cdrom device" msgstr "" #: share/virtualbricks.template.glade:1110 msgid "Select images for Qemu volumes" msgstr "" #: share/virtualbricks.template.glade:1134 #: share/virtualbricks.template.glade:12317 #: share/virtualbricks.template.glade:12354 msgid "fdb" msgstr "" #: share/virtualbricks.template.glade:1148 #: share/virtualbricks.template.glade:12302 #: share/virtualbricks.template.glade:12339 msgid "fda" msgstr "" #: share/virtualbricks.template.glade:1162 msgid "hdd" msgstr "" #: share/virtualbricks.template.glade:1176 msgid "hdc" msgstr "" #: share/virtualbricks.template.glade:1190 msgid "hdb" msgstr "" #: share/virtualbricks.template.glade:1204 msgid "hda" msgstr "" #: share/virtualbricks.template.glade:1315 msgid "mtdblock" msgstr "" #: share/virtualbricks.template.glade:1360 #: share/virtualbricks.template.glade:1401 #: share/virtualbricks.template.glade:1444 #: share/virtualbricks.template.glade:1487 #: share/virtualbricks.template.glade:1530 #: share/virtualbricks.template.glade:1573 #: share/virtualbricks.template.glade:1616 msgid "Private COW" msgstr "" #: share/virtualbricks.template.glade:1648 msgid "additional media" msgstr "" #: share/virtualbricks.template.glade:1685 #: share/virtualbricks.template.glade:12383 #: share/virtualbricks.template.glade:12420 msgid "Drives" msgstr "" #: share/virtualbricks.template.glade:1723 msgid "Architecture: " msgstr "" #: share/virtualbricks.template.glade:1752 #: share/virtualbricks.template.glade:1802 msgid "\n" msgstr "" #: share/virtualbricks.template.glade:1764 msgid "CPU Type" msgstr "" #: share/virtualbricks.template.glade:1776 msgid "" "\n" "\n" msgstr "" #: share/virtualbricks.template.glade:1790 msgid "Machine type" msgstr "" #: share/virtualbricks.template.glade:1813 #: share/virtualbricks.template.glade:1816 msgid "KVM" msgstr "" #: share/virtualbricks.template.glade:1833 #: share/virtualbricks.template.glade:1870 msgid "System and machine" msgstr "" #: share/virtualbricks.template.glade:1891 #: share/virtualbricks.template.glade:1928 msgid "disable graphical output" msgstr "" #: share/virtualbricks.template.glade:1896 #: share/virtualbricks.template.glade:1933 msgid "disable graphical output and redirect serial I/Os to console" msgstr "" #: share/virtualbricks.template.glade:1923 #: share/virtualbricks.template.glade:1960 msgid "Use VGA instead of Default" msgstr "" #: share/virtualbricks.template.glade:1928 #: share/virtualbricks.template.glade:1965 msgid "" "simulate a standard VGA card with VESA Bochs Extensions (default is CL-" "GD5446 PCI VGA)" msgstr "" #: share/virtualbricks.template.glade:1943 #: share/virtualbricks.template.glade:1980 msgid "Start in vncserver" msgstr "" #: share/virtualbricks.template.glade:1948 #: share/virtualbricks.template.glade:1985 msgid "start emulation in a VNC server on display" msgstr "" #: share/virtualbricks.template.glade:1962 #: share/virtualbricks.template.glade:1999 msgid "on Display: " msgstr "" #: share/virtualbricks.template.glade:1974 #: share/virtualbricks.template.glade:2011 msgid "select Dsiplay for VNC server" msgstr "" #: share/virtualbricks.template.glade:1992 #: share/virtualbricks.template.glade:2029 msgid "SDL" msgstr "" #: share/virtualbricks.template.glade:2004 #: share/virtualbricks.template.glade:2041 msgid "Portrait" msgstr "" #: share/virtualbricks.template.glade:2026 #: share/virtualbricks.template.glade:2063 msgid "Display Options" msgstr "" #: share/virtualbricks.template.glade:2055 #: share/virtualbricks.template.glade:2092 msgid "enable usb" msgstr "" #: share/virtualbricks.template.glade:2060 #: share/virtualbricks.template.glade:2097 msgid "enable access to usb" msgstr "" #: share/virtualbricks.template.glade:2091 #: share/virtualbricks.template.glade:2128 msgid "USB settings" msgstr "" #: share/virtualbricks.template.glade:2128 #: share/virtualbricks.template.glade:2165 msgid "Set realtime clock to local time" msgstr "" #: share/virtualbricks.template.glade:2133 #: share/virtualbricks.template.glade:2170 msgid "set the real time clock to local time [default=utc]" msgstr "" #: share/virtualbricks.template.glade:2145 #: share/virtualbricks.template.glade:2182 msgid "Guest time drift compensation (TDF)" msgstr "" #: share/virtualbricks.template.glade:2163 #: share/virtualbricks.template.glade:2200 msgid "Keyboard: " msgstr "" #: share/virtualbricks.template.glade:2193 #: share/virtualbricks.template.glade:2230 msgid "Serial" msgstr "" #: share/virtualbricks.template.glade:2210 #: share/virtualbricks.template.glade:2247 msgid "Extra Settings" msgstr "" #: share/virtualbricks.template.glade:2256 #: share/virtualbricks.template.glade:2293 msgid "select emulated Soundcard " msgstr "" #: share/virtualbricks.template.glade:2284 #: share/virtualbricks.template.glade:2626 #: share/virtualbricks.template.glade:3463 #: share/virtualbricks.template.glade:3484 #: share/virtualbricks.template.glade:10116 #: share/virtualbricks.template.glade:10137 #: share/virtualbricks.template.glade:10289 #: share/virtualbricks.template.glade:10508 #: share/virtualbricks.template.glade:2321 #: share/virtualbricks.template.glade:2663 #: share/virtualbricks.template.glade:3500 #: share/virtualbricks.template.glade:3521 #: share/virtualbricks.template.glade:10153 #: share/virtualbricks.template.glade:10174 #: share/virtualbricks.template.glade:10326 #: share/virtualbricks.template.glade:10545 msgid " \n" msgstr "" #: share/virtualbricks.template.glade:2300 #: share/virtualbricks.template.glade:2337 msgid "Audio Device Settings" msgstr "" #: share/virtualbricks.template.glade:2329 #: share/virtualbricks.template.glade:2366 msgid "Used RAM:" msgstr "" #: share/virtualbricks.template.glade:2355 #: share/virtualbricks.template.glade:2402 #: share/virtualbricks.template.glade:2392 #: share/virtualbricks.template.glade:2439 msgid " MB" msgstr "" #: share/virtualbricks.template.glade:2373 #: share/virtualbricks.template.glade:2410 msgid "KVM Shadow Memory: " msgstr "" #: share/virtualbricks.template.glade:2420 #: share/virtualbricks.template.glade:2457 msgid "Memory Settings" msgstr "" #: share/virtualbricks.template.glade:2481 #: share/virtualbricks.template.glade:2518 msgid "System" msgstr "" #: share/virtualbricks.template.glade:2507 #: share/virtualbricks.template.glade:2544 msgid "Disable networking" msgstr "" #: share/virtualbricks.template.glade:2534 #: share/virtualbricks.template.glade:2571 msgid "No Network" msgstr "" #: share/virtualbricks.template.glade:2561 #: share/virtualbricks.template.glade:2598 msgid "Start with usermode network (default)" msgstr "" #: share/virtualbricks.template.glade:2587 #: share/virtualbricks.template.glade:2624 msgid "Connect to network" msgstr "" #: share/virtualbricks.template.glade:2613 #: share/virtualbricks.template.glade:9901 #: share/virtualbricks.template.glade:2650 #: share/virtualbricks.template.glade:9938 msgid "Connect to:" msgstr "" #: share/virtualbricks.template.glade:2637 #: share/virtualbricks.template.glade:2674 msgid "Virtual ethernet model:" msgstr "" #: share/virtualbricks.template.glade:2648 #: share/virtualbricks.template.glade:2685 msgid "" "\n" "rtl8139\n" "e1000\n" "virtio\n" "i82551\n" "i82557b\n" "i82559er\n" "ne2k_pci\n" "pcnet\n" "ne2k_isa\n" msgstr "" #: share/virtualbricks.template.glade:2668 #: share/virtualbricks.template.glade:2705 msgid "Mac address:" msgstr "" #: share/virtualbricks.template.glade:2689 #: share/virtualbricks.template.glade:2726 msgid "Randomize" msgstr "" #: share/virtualbricks.template.glade:2719 #: share/virtualbricks.template.glade:2756 msgid "Set up a new network card" msgstr "" #: share/virtualbricks.template.glade:2746 #: share/virtualbricks.template.glade:2783 msgid "Add Network card" msgstr "" #: share/virtualbricks.template.glade:2772 #: share/virtualbricks.template.glade:2809 msgid "Edit selected network card or redirection" msgstr "" #: share/virtualbricks.template.glade:2799 #: share/virtualbricks.template.glade:2836 msgid "Edit" msgstr "" #: share/virtualbricks.template.glade:2825 #: share/virtualbricks.template.glade:2862 msgid "Remove selected network card or redirection" msgstr "" #: share/virtualbricks.template.glade:2853 #: share/virtualbricks.template.glade:11302 #: share/virtualbricks.template.glade:2890 #: share/virtualbricks.template.glade:11339 msgid "Remove" msgstr "" #: share/virtualbricks.template.glade:2913 #: share/virtualbricks.template.glade:2950 msgid "SMB share" msgstr "" #: share/virtualbricks.template.glade:2938 #: share/virtualbricks.template.glade:2975 msgid "SMB Share" msgstr "" #: share/virtualbricks.template.glade:2994 #: share/virtualbricks.template.glade:3031 msgid "Network cards" msgstr "" #: share/virtualbricks.template.glade:3027 #: share/virtualbricks.template.glade:3064 msgid "Network" msgstr "" #: share/virtualbricks.template.glade:3055 #: share/virtualbricks.template.glade:3092 msgid "Use a custom kernel" msgstr "" #: share/virtualbricks.template.glade:3068 #: share/virtualbricks.template.glade:3105 msgid "Specify initial ramdisk" msgstr "" #: share/virtualbricks.template.glade:3099 #: share/virtualbricks.template.glade:3136 msgid "Parameters to append to command line:" msgstr "" #: share/virtualbricks.template.glade:3211 #: share/virtualbricks.template.glade:3248 msgid "Enable kernel debugging" msgstr "" #: share/virtualbricks.template.glade:3226 #: share/virtualbricks.template.glade:3263 msgid "GNU debugger TCP port:" msgstr "" #: share/virtualbricks.template.glade:3259 #: share/virtualbricks.template.glade:3296 msgid "Booting Linux" msgstr "" #: share/virtualbricks.template.glade:3286 #: share/virtualbricks.template.glade:3323 msgid "Customize Linux Boot" msgstr "" #: share/virtualbricks.template.glade:3379 #: share/virtualbricks.template.glade:3416 msgid "Virtual Machine Icon" msgstr "" #: share/virtualbricks.template.glade:3419 #: share/virtualbricks.template.glade:3456 msgid "Others" msgstr "" #: share/virtualbricks.template.glade:3473 #: share/virtualbricks.template.glade:10126 #: share/virtualbricks.template.glade:3510 #: share/virtualbricks.template.glade:10163 msgid "<=== connect ===>" msgstr "" #: share/virtualbricks.template.glade:3502 #: share/virtualbricks.template.glade:3539 msgid "Plugs" msgstr "" #: share/virtualbricks.template.glade:3532 #: share/virtualbricks.template.glade:4256 #: share/virtualbricks.template.glade:5024 #: share/virtualbricks.template.glade:5745 #: share/virtualbricks.template.glade:6488 #: share/virtualbricks.template.glade:7209 #: share/virtualbricks.template.glade:7950 #: share/virtualbricks.template.glade:8675 #: share/virtualbricks.template.glade:9407 #: share/virtualbricks.template.glade:3569 #: share/virtualbricks.template.glade:4293 #: share/virtualbricks.template.glade:5061 #: share/virtualbricks.template.glade:5782 #: share/virtualbricks.template.glade:6525 #: share/virtualbricks.template.glade:7246 #: share/virtualbricks.template.glade:7987 #: share/virtualbricks.template.glade:8712 #: share/virtualbricks.template.glade:9444 msgid "Symmetrical" msgstr "" #: share/virtualbricks.template.glade:3550 #: share/virtualbricks.template.glade:5042 #: share/virtualbricks.template.glade:5763 #: share/virtualbricks.template.glade:6506 #: share/virtualbricks.template.glade:7227 #: share/virtualbricks.template.glade:7968 #: share/virtualbricks.template.glade:8693 #: share/virtualbricks.template.glade:9425 #: share/virtualbricks.template.glade:3587 #: share/virtualbricks.template.glade:5079 #: share/virtualbricks.template.glade:5800 #: share/virtualbricks.template.glade:6543 #: share/virtualbricks.template.glade:7264 #: share/virtualbricks.template.glade:8005 #: share/virtualbricks.template.glade:8730 #: share/virtualbricks.template.glade:9462 msgid "Multiplier" msgstr "" #: share/virtualbricks.template.glade:3579 #: share/virtualbricks.template.glade:4303 #: share/virtualbricks.template.glade:5069 #: share/virtualbricks.template.glade:5792 #: share/virtualbricks.template.glade:6533 #: share/virtualbricks.template.glade:7254 #: share/virtualbricks.template.glade:7998 #: share/virtualbricks.template.glade:8720 #: share/virtualbricks.template.glade:9454 #: share/virtualbricks.template.glade:3616 #: share/virtualbricks.template.glade:4340 #: share/virtualbricks.template.glade:5106 #: share/virtualbricks.template.glade:5829 #: share/virtualbricks.template.glade:6570 #: share/virtualbricks.template.glade:7291 #: share/virtualbricks.template.glade:8035 #: share/virtualbricks.template.glade:8757 #: share/virtualbricks.template.glade:9491 msgid "UM" msgstr "" #: share/virtualbricks.template.glade:3605 #: share/virtualbricks.template.glade:4329 #: share/virtualbricks.template.glade:5094 #: share/virtualbricks.template.glade:5817 #: share/virtualbricks.template.glade:6558 #: share/virtualbricks.template.glade:7279 #: share/virtualbricks.template.glade:8024 #: share/virtualbricks.template.glade:8745 #: share/virtualbricks.template.glade:9480 #: share/virtualbricks.template.glade:3642 #: share/virtualbricks.template.glade:4366 #: share/virtualbricks.template.glade:5131 #: share/virtualbricks.template.glade:5854 #: share/virtualbricks.template.glade:6595 #: share/virtualbricks.template.glade:7316 #: share/virtualbricks.template.glade:8061 #: share/virtualbricks.template.glade:8782 #: share/virtualbricks.template.glade:9517 msgid "General parameters" msgstr "" #: share/virtualbricks.template.glade:3632 #: share/virtualbricks.template.glade:3819 #: share/virtualbricks.template.glade:4015 #: share/virtualbricks.template.glade:4356 #: share/virtualbricks.template.glade:4543 #: share/virtualbricks.template.glade:4739 #: share/virtualbricks.template.glade:5121 #: share/virtualbricks.template.glade:5308 #: share/virtualbricks.template.glade:5504 #: share/virtualbricks.template.glade:5844 #: share/virtualbricks.template.glade:6031 #: share/virtualbricks.template.glade:6227 #: share/virtualbricks.template.glade:6585 #: share/virtualbricks.template.glade:6772 #: share/virtualbricks.template.glade:6968 #: share/virtualbricks.template.glade:7306 #: share/virtualbricks.template.glade:7493 #: share/virtualbricks.template.glade:7689 #: share/virtualbricks.template.glade:8051 #: share/virtualbricks.template.glade:8238 #: share/virtualbricks.template.glade:8434 #: share/virtualbricks.template.glade:8772 #: share/virtualbricks.template.glade:8959 #: share/virtualbricks.template.glade:9155 #: share/virtualbricks.template.glade:9507 #: share/virtualbricks.template.glade:9577 #: share/virtualbricks.template.glade:9656 #: share/virtualbricks.template.glade:3669 #: share/virtualbricks.template.glade:3856 #: share/virtualbricks.template.glade:4052 #: share/virtualbricks.template.glade:4393 #: share/virtualbricks.template.glade:4580 #: share/virtualbricks.template.glade:4776 #: share/virtualbricks.template.glade:5158 #: share/virtualbricks.template.glade:5345 #: share/virtualbricks.template.glade:5541 #: share/virtualbricks.template.glade:5881 #: share/virtualbricks.template.glade:6068 #: share/virtualbricks.template.glade:6264 #: share/virtualbricks.template.glade:6622 #: share/virtualbricks.template.glade:6809 #: share/virtualbricks.template.glade:7005 #: share/virtualbricks.template.glade:7343 #: share/virtualbricks.template.glade:7530 #: share/virtualbricks.template.glade:7726 #: share/virtualbricks.template.glade:8088 #: share/virtualbricks.template.glade:8275 #: share/virtualbricks.template.glade:8471 #: share/virtualbricks.template.glade:8809 #: share/virtualbricks.template.glade:8996 #: share/virtualbricks.template.glade:9192 #: share/virtualbricks.template.glade:9544 #: share/virtualbricks.template.glade:9614 #: share/virtualbricks.template.glade:9693 msgid "Base" msgstr "" #: share/virtualbricks.template.glade:3671 #: share/virtualbricks.template.glade:3858 #: share/virtualbricks.template.glade:4054 #: share/virtualbricks.template.glade:4395 #: share/virtualbricks.template.glade:4582 #: share/virtualbricks.template.glade:4778 #: share/virtualbricks.template.glade:5160 #: share/virtualbricks.template.glade:5347 #: share/virtualbricks.template.glade:5543 #: share/virtualbricks.template.glade:5883 #: share/virtualbricks.template.glade:6070 #: share/virtualbricks.template.glade:6266 #: share/virtualbricks.template.glade:6624 #: share/virtualbricks.template.glade:6811 #: share/virtualbricks.template.glade:7007 #: share/virtualbricks.template.glade:7345 #: share/virtualbricks.template.glade:7532 #: share/virtualbricks.template.glade:7728 #: share/virtualbricks.template.glade:8090 #: share/virtualbricks.template.glade:8277 #: share/virtualbricks.template.glade:8473 #: share/virtualbricks.template.glade:8811 #: share/virtualbricks.template.glade:8998 #: share/virtualbricks.template.glade:9194 #: share/virtualbricks.template.glade:3708 #: share/virtualbricks.template.glade:3895 #: share/virtualbricks.template.glade:4091 #: share/virtualbricks.template.glade:4432 #: share/virtualbricks.template.glade:4619 #: share/virtualbricks.template.glade:4815 #: share/virtualbricks.template.glade:5197 #: share/virtualbricks.template.glade:5384 #: share/virtualbricks.template.glade:5580 #: share/virtualbricks.template.glade:5920 #: share/virtualbricks.template.glade:6107 #: share/virtualbricks.template.glade:6303 #: share/virtualbricks.template.glade:6661 #: share/virtualbricks.template.glade:6848 #: share/virtualbricks.template.glade:7044 #: share/virtualbricks.template.glade:7382 #: share/virtualbricks.template.glade:7569 #: share/virtualbricks.template.glade:7765 #: share/virtualbricks.template.glade:8127 #: share/virtualbricks.template.glade:8314 #: share/virtualbricks.template.glade:8510 #: share/virtualbricks.template.glade:8848 #: share/virtualbricks.template.glade:9035 #: share/virtualbricks.template.glade:9231 msgid "±" msgstr "" #: share/virtualbricks.template.glade:3692 #: share/virtualbricks.template.glade:3879 #: share/virtualbricks.template.glade:4075 #: share/virtualbricks.template.glade:4416 #: share/virtualbricks.template.glade:4603 #: share/virtualbricks.template.glade:4799 #: share/virtualbricks.template.glade:5181 #: share/virtualbricks.template.glade:5368 #: share/virtualbricks.template.glade:5564 #: share/virtualbricks.template.glade:5904 #: share/virtualbricks.template.glade:6091 #: share/virtualbricks.template.glade:6287 #: share/virtualbricks.template.glade:6645 #: share/virtualbricks.template.glade:6832 #: share/virtualbricks.template.glade:7028 #: share/virtualbricks.template.glade:7366 #: share/virtualbricks.template.glade:7553 #: share/virtualbricks.template.glade:7749 #: share/virtualbricks.template.glade:8111 #: share/virtualbricks.template.glade:8298 #: share/virtualbricks.template.glade:8494 #: share/virtualbricks.template.glade:8832 #: share/virtualbricks.template.glade:9019 #: share/virtualbricks.template.glade:9215 #: share/virtualbricks.template.glade:3729 #: share/virtualbricks.template.glade:3916 #: share/virtualbricks.template.glade:4112 #: share/virtualbricks.template.glade:4453 #: share/virtualbricks.template.glade:4640 #: share/virtualbricks.template.glade:4836 #: share/virtualbricks.template.glade:5218 #: share/virtualbricks.template.glade:5405 #: share/virtualbricks.template.glade:5601 #: share/virtualbricks.template.glade:5941 #: share/virtualbricks.template.glade:6128 #: share/virtualbricks.template.glade:6324 #: share/virtualbricks.template.glade:6682 #: share/virtualbricks.template.glade:6869 #: share/virtualbricks.template.glade:7065 #: share/virtualbricks.template.glade:7403 #: share/virtualbricks.template.glade:7590 #: share/virtualbricks.template.glade:7786 #: share/virtualbricks.template.glade:8148 #: share/virtualbricks.template.glade:8335 #: share/virtualbricks.template.glade:8531 #: share/virtualbricks.template.glade:8869 #: share/virtualbricks.template.glade:9056 #: share/virtualbricks.template.glade:9252 msgid "Jitter" msgstr "" #: share/virtualbricks.template.glade:3731 #: share/virtualbricks.template.glade:3918 #: share/virtualbricks.template.glade:4114 #: share/virtualbricks.template.glade:4455 #: share/virtualbricks.template.glade:4642 #: share/virtualbricks.template.glade:4838 #: share/virtualbricks.template.glade:5220 #: share/virtualbricks.template.glade:5407 #: share/virtualbricks.template.glade:5603 #: share/virtualbricks.template.glade:5943 #: share/virtualbricks.template.glade:6130 #: share/virtualbricks.template.glade:6326 #: share/virtualbricks.template.glade:6684 #: share/virtualbricks.template.glade:6871 #: share/virtualbricks.template.glade:7067 #: share/virtualbricks.template.glade:7405 #: share/virtualbricks.template.glade:7592 #: share/virtualbricks.template.glade:7788 #: share/virtualbricks.template.glade:8150 #: share/virtualbricks.template.glade:8337 #: share/virtualbricks.template.glade:8533 #: share/virtualbricks.template.glade:8871 #: share/virtualbricks.template.glade:9058 #: share/virtualbricks.template.glade:9254 #: share/virtualbricks.template.glade:3768 #: share/virtualbricks.template.glade:3955 #: share/virtualbricks.template.glade:4151 #: share/virtualbricks.template.glade:4492 #: share/virtualbricks.template.glade:4679 #: share/virtualbricks.template.glade:4875 #: share/virtualbricks.template.glade:5257 #: share/virtualbricks.template.glade:5444 #: share/virtualbricks.template.glade:5640 #: share/virtualbricks.template.glade:5980 #: share/virtualbricks.template.glade:6167 #: share/virtualbricks.template.glade:6363 #: share/virtualbricks.template.glade:6721 #: share/virtualbricks.template.glade:6908 #: share/virtualbricks.template.glade:7104 #: share/virtualbricks.template.glade:7442 #: share/virtualbricks.template.glade:7629 #: share/virtualbricks.template.glade:7825 #: share/virtualbricks.template.glade:8187 #: share/virtualbricks.template.glade:8374 #: share/virtualbricks.template.glade:8570 #: share/virtualbricks.template.glade:8908 #: share/virtualbricks.template.glade:9095 #: share/virtualbricks.template.glade:9291 msgid "%" msgstr "" #: share/virtualbricks.template.glade:3751 #: share/virtualbricks.template.glade:3938 #: share/virtualbricks.template.glade:4134 #: share/virtualbricks.template.glade:4858 #: share/virtualbricks.template.glade:5240 #: share/virtualbricks.template.glade:5427 #: share/virtualbricks.template.glade:5623 #: share/virtualbricks.template.glade:5963 #: share/virtualbricks.template.glade:6150 #: share/virtualbricks.template.glade:6346 #: share/virtualbricks.template.glade:6704 #: share/virtualbricks.template.glade:6891 #: share/virtualbricks.template.glade:7087 #: share/virtualbricks.template.glade:7425 #: share/virtualbricks.template.glade:7612 #: share/virtualbricks.template.glade:7808 #: share/virtualbricks.template.glade:8170 #: share/virtualbricks.template.glade:8357 #: share/virtualbricks.template.glade:8553 #: share/virtualbricks.template.glade:8891 #: share/virtualbricks.template.glade:9078 #: share/virtualbricks.template.glade:9274 #: share/virtualbricks.template.glade:3788 #: share/virtualbricks.template.glade:3975 #: share/virtualbricks.template.glade:4171 #: share/virtualbricks.template.glade:4895 #: share/virtualbricks.template.glade:5277 #: share/virtualbricks.template.glade:5464 #: share/virtualbricks.template.glade:5660 #: share/virtualbricks.template.glade:6000 #: share/virtualbricks.template.glade:6187 #: share/virtualbricks.template.glade:6383 #: share/virtualbricks.template.glade:6741 #: share/virtualbricks.template.glade:6928 #: share/virtualbricks.template.glade:7124 #: share/virtualbricks.template.glade:7462 #: share/virtualbricks.template.glade:7649 #: share/virtualbricks.template.glade:7845 #: share/virtualbricks.template.glade:8207 #: share/virtualbricks.template.glade:8394 #: share/virtualbricks.template.glade:8590 #: share/virtualbricks.template.glade:8928 #: share/virtualbricks.template.glade:9115 #: share/virtualbricks.template.glade:9311 msgid "Distrib." msgstr "" #: share/virtualbricks.template.glade:3780 #: share/virtualbricks.template.glade:4504 #: share/virtualbricks.template.glade:5269 #: share/virtualbricks.template.glade:5992 #: share/virtualbricks.template.glade:6733 #: share/virtualbricks.template.glade:7454 #: share/virtualbricks.template.glade:8199 #: share/virtualbricks.template.glade:8920 #: share/virtualbricks.template.glade:9538 #: share/virtualbricks.template.glade:3817 #: share/virtualbricks.template.glade:4541 #: share/virtualbricks.template.glade:5306 #: share/virtualbricks.template.glade:6029 #: share/virtualbricks.template.glade:6770 #: share/virtualbricks.template.glade:7491 #: share/virtualbricks.template.glade:8236 #: share/virtualbricks.template.glade:8957 #: share/virtualbricks.template.glade:9575 msgid "Left to Right" msgstr "" #: share/virtualbricks.template.glade:3975 #: share/virtualbricks.template.glade:4699 #: share/virtualbricks.template.glade:5464 #: share/virtualbricks.template.glade:6187 #: share/virtualbricks.template.glade:6928 #: share/virtualbricks.template.glade:7649 #: share/virtualbricks.template.glade:8394 #: share/virtualbricks.template.glade:9115 #: share/virtualbricks.template.glade:9616 #: share/virtualbricks.template.glade:4012 #: share/virtualbricks.template.glade:4736 #: share/virtualbricks.template.glade:5501 #: share/virtualbricks.template.glade:6224 #: share/virtualbricks.template.glade:6965 #: share/virtualbricks.template.glade:7686 #: share/virtualbricks.template.glade:8431 #: share/virtualbricks.template.glade:9152 #: share/virtualbricks.template.glade:9653 msgid "Both Directions" msgstr "" #: share/virtualbricks.template.glade:4172 #: share/virtualbricks.template.glade:4896 #: share/virtualbricks.template.glade:5661 #: share/virtualbricks.template.glade:6384 #: share/virtualbricks.template.glade:7125 #: share/virtualbricks.template.glade:7846 #: share/virtualbricks.template.glade:8591 #: share/virtualbricks.template.glade:9312 #: share/virtualbricks.template.glade:9696 #: share/virtualbricks.template.glade:4209 #: share/virtualbricks.template.glade:4933 #: share/virtualbricks.template.glade:5698 #: share/virtualbricks.template.glade:6421 #: share/virtualbricks.template.glade:7162 #: share/virtualbricks.template.glade:7883 #: share/virtualbricks.template.glade:8628 #: share/virtualbricks.template.glade:9349 #: share/virtualbricks.template.glade:9733 msgid "Right to Left" msgstr "" #: share/virtualbricks.template.glade:4198 #: share/virtualbricks.template.glade:4235 msgid "Bandwidth Restriction" msgstr "" #: share/virtualbricks.template.glade:4484 #: share/virtualbricks.template.glade:4671 #: share/virtualbricks.template.glade:4521 msgid "" "Uniform\n" "Gaussian" msgstr "" #: share/virtualbricks.template.glade:4922 #: share/virtualbricks.template.glade:4959 msgid "Interface Speed" msgstr "" #: share/virtualbricks.template.glade:4941 #: share/virtualbricks.template.glade:4978 msgid "Enable(advanced)" msgstr "" #: share/virtualbricks.template.glade:4993 #: share/virtualbricks.template.glade:5030 msgid "Bandwidth" msgstr "" #: share/virtualbricks.template.glade:5687 #: share/virtualbricks.template.glade:5724 msgid "Packet Delay" msgstr "" #: share/virtualbricks.template.glade:6410 #: share/virtualbricks.template.glade:6447 msgid "Channel Buffer Size" msgstr "" #: share/virtualbricks.template.glade:6458 virtualbricks/brickfactory.py:822 #: share/virtualbricks.template.glade:6495 virtualbricks/brickfactory.py:885 msgid "Delay" msgstr "" #: share/virtualbricks.template.glade:7151 #: share/virtualbricks.template.glade:7188 msgid "Packet Loss" msgstr "" #: share/virtualbricks.template.glade:7872 #: share/virtualbricks.template.glade:7909 msgid "Packet Duplication" msgstr "" #: share/virtualbricks.template.glade:7920 #: share/virtualbricks.template.glade:7957 msgid "Disruptions 1/3" msgstr "" #: share/virtualbricks.template.glade:8617 #: share/virtualbricks.template.glade:8654 msgid "Noise" msgstr "" #: share/virtualbricks.template.glade:9338 #: share/virtualbricks.template.glade:9375 msgid "Lost Burst" msgstr "" #: share/virtualbricks.template.glade:9376 #: share/virtualbricks.template.glade:9413 msgid "Disruptions 2/3" msgstr "" #: share/virtualbricks.template.glade:9463 msgid "" "bits\n" "bytes" msgstr "" #: share/virtualbricks.template.glade:9722 #: share/virtualbricks.template.glade:9759 msgid "Maximum Transmission Unit (MTU)" msgstr "" #: share/virtualbricks.template.glade:9764 #: share/virtualbricks.template.glade:9801 msgid "Disruptions 3/3" msgstr "" #: share/virtualbricks.template.glade:9800 #: share/virtualbricks.template.glade:9837 msgid "Number of ports: " msgstr "" #: share/virtualbricks.template.glade:9826 #: share/virtualbricks.template.glade:9863 msgid "Use FSTP" msgstr "" #: share/virtualbricks.template.glade:9838 #: share/virtualbricks.template.glade:9875 msgid "Hub mode" msgstr "" #: share/virtualbricks.template.glade:9860 #: share/virtualbricks.template.glade:9897 msgid "Switch Configuration" msgstr "" #: share/virtualbricks.template.glade:9910 #: share/virtualbricks.template.glade:9947 msgid "" " \n" "\n" msgstr "" #: share/virtualbricks.template.glade:9941 #: share/virtualbricks.template.glade:9978 msgid "Don't touch interface settings" msgstr "" #: share/virtualbricks.template.glade:9951 #: share/virtualbricks.template.glade:9988 msgid "Use DHCP" msgstr "" #: share/virtualbricks.template.glade:9966 #: share/virtualbricks.template.glade:10003 msgid "Manual settings" msgstr "" #: share/virtualbricks.template.glade:9996 #: share/virtualbricks.template.glade:10033 msgid "IP Address: " msgstr "" #: share/virtualbricks.template.glade:10003 #: share/virtualbricks.template.glade:10040 msgid "Netmask: " msgstr "" #: share/virtualbricks.template.glade:10014 #: share/virtualbricks.template.glade:10051 msgid "Gateway: " msgstr "" #: share/virtualbricks.template.glade:10028 #: share/virtualbricks.template.glade:10065 msgid "10.0.0.1" msgstr "" #: share/virtualbricks.template.glade:10043 #: share/virtualbricks.template.glade:10080 msgid "255.0.0.0" msgstr "" #: share/virtualbricks.template.glade:10084 #: share/virtualbricks.template.glade:10121 msgid "Tap Configuration" msgstr "" #: share/virtualbricks.template.glade:10177 #: share/virtualbricks.template.glade:14202 #: share/virtualbricks.template.glade:10214 #: share/virtualbricks.template.glade:14239 msgid "Delay:" msgstr "" #: share/virtualbricks.template.glade:10209 virtualbricks/brickfactory.py:825 #: share/virtualbricks.template.glade:10246 virtualbricks/brickfactory.py:888 msgid "Actions" msgstr "" #: share/virtualbricks.template.glade:10248 #: share/virtualbricks.template.glade:10285 msgid "Event Configuration" msgstr "" #: share/virtualbricks.template.glade:10283 #: share/virtualbricks.template.glade:10398 #: share/virtualbricks.template.glade:10320 #: share/virtualbricks.template.glade:10435 msgid "Connect to" msgstr "" #: share/virtualbricks.template.glade:10315 #: share/virtualbricks.template.glade:10352 msgid "Listen to port:" msgstr "" #: share/virtualbricks.template.glade:10325 #: share/virtualbricks.template.glade:10362 msgid "Expect password:" msgstr "" #: share/virtualbricks.template.glade:10364 #: share/virtualbricks.template.glade:10401 msgid "Tunnel server Configuration" msgstr "" #: share/virtualbricks.template.glade:10418 #: share/virtualbricks.template.glade:12758 #: share/virtualbricks.template.glade:10455 #: share/virtualbricks.template.glade:12795 msgid "port:" msgstr "" #: share/virtualbricks.template.glade:10448 #: share/virtualbricks.template.glade:13780 #: share/virtualbricks.template.glade:10485 #: share/virtualbricks.template.glade:13817 msgid "Tunnel Server" msgstr "" #: share/virtualbricks.template.glade:10473 #: share/virtualbricks.template.glade:10510 msgid "Password:" msgstr "" #: share/virtualbricks.template.glade:10484 #: share/virtualbricks.template.glade:10521 msgid "Local port:" msgstr "" #: share/virtualbricks.template.glade:10527 #: share/virtualbricks.template.glade:10564 msgid "Tunnel client Configuration" msgstr "" #: share/virtualbricks.template.glade:10566 #: share/virtualbricks.template.glade:10603 msgid "WAIT..." msgstr "" #: share/virtualbricks.template.glade:10671 #: share/virtualbricks.template.glade:10708 msgid "Virtualbricks Settings" msgstr "" #: share/virtualbricks.template.glade:10684 #: share/virtualbricks.template.glade:10721 msgid "System Settings" msgstr "" #: share/virtualbricks.template.glade:10719 #: share/virtualbricks.template.glade:10756 msgid "Bricks directory" msgstr "" #: share/virtualbricks.template.glade:10727 #: share/virtualbricks.template.glade:10863 #: share/virtualbricks.template.glade:11012 #: share/virtualbricks.template.glade:11096 #: share/virtualbricks.template.glade:10764 #: share/virtualbricks.template.glade:10900 #: share/virtualbricks.template.glade:11049 #: share/virtualbricks.template.glade:11133 msgid "Select A Folder" msgstr "" #: share/virtualbricks.template.glade:10738 #: share/virtualbricks.template.glade:10775 msgid "X-window terminal command" msgstr "" #: share/virtualbricks.template.glade:10749 #: share/virtualbricks.template.glade:10786 msgid "X-window sudo command" msgstr "" #: share/virtualbricks.template.glade:10760 #: share/virtualbricks.template.glade:10797 msgid "your favorite x-terminal-emulator" msgstr "" #: share/virtualbricks.template.glade:10774 #: share/virtualbricks.template.glade:10811 msgid "command to perform administrative actions on your system" msgstr "" #: share/virtualbricks.template.glade:10798 #: share/virtualbricks.template.glade:10835 msgid "Enable SysTray" msgstr "" #: share/virtualbricks.template.glade:10819 #: share/virtualbricks.template.glade:10856 msgid "General" msgstr "" #: share/virtualbricks.template.glade:10855 #: share/virtualbricks.template.glade:10892 msgid "VDE binaries path" msgstr "" #: share/virtualbricks.template.glade:10861 #: share/virtualbricks.template.glade:10898 msgid "Path for vde components installed on the system" msgstr "" #: share/virtualbricks.template.glade:10876 #: share/virtualbricks.template.glade:11025 #: share/virtualbricks.template.glade:10913 #: share/virtualbricks.template.glade:11062 msgid "Status:" msgstr "" #: share/virtualbricks.template.glade:10892 #: share/virtualbricks.template.glade:10929 msgid "" "Error:\n" "invalid path for vde binaries" msgstr "" #: share/virtualbricks.template.glade:10919 #: share/virtualbricks.template.glade:10956 msgid "Use python support" msgstr "" #: share/virtualbricks.template.glade:10923 #: share/virtualbricks.template.glade:10960 msgid "Use native python support from libvdeplug" msgstr "" #: share/virtualbricks.template.glade:10932 #: share/virtualbricks.template.glade:10969 msgid "Allow female plugs on devices" msgstr "" #: share/virtualbricks.template.glade:10936 #: share/virtualbricks.template.glade:10973 msgid "Allow use of female plugs with all brick types" msgstr "" #: share/virtualbricks.template.glade:10945 #: share/virtualbricks.template.glade:10982 msgid "Network topology loop detection" msgstr "" #: share/virtualbricks.template.glade:10949 #: share/virtualbricks.template.glade:10986 msgid "" "If enabled, detect network loops when starting the bricks, and generate an " "error." msgstr "" #: share/virtualbricks.template.glade:10963 #: share/virtualbricks.template.glade:11000 msgid "Vde" msgstr "" #: share/virtualbricks.template.glade:11004 #: share/virtualbricks.template.glade:11041 msgid "Qemu/KVM binaries path" msgstr "" #: share/virtualbricks.template.glade:11010 #: share/virtualbricks.template.glade:11047 msgid "Path for qemu and kvm binaries" msgstr "" #: share/virtualbricks.template.glade:11041 #: share/virtualbricks.template.glade:11078 msgid "" "Error:\n" "invalid path for qemu/kvm binaries" msgstr "" #: share/virtualbricks.template.glade:11088 #: share/virtualbricks.template.glade:11125 msgid "Disk images repository" msgstr "" #: share/virtualbricks.template.glade:11094 #: share/virtualbricks.template.glade:11131 msgid "Directory that contains hard disk images" msgstr "" #: share/virtualbricks.template.glade:11112 #: share/virtualbricks.template.glade:11149 msgid "Disk Images" msgstr "" #: share/virtualbricks.template.glade:11140 #: share/virtualbricks.template.glade:11177 msgid "Use KVM" msgstr "" #: share/virtualbricks.template.glade:11144 #: share/virtualbricks.template.glade:11181 msgid "Allow the use of kernel-based virtual machine (recommended)" msgstr "" #: share/virtualbricks.template.glade:11154 #: share/virtualbricks.template.glade:11191 msgid "Enable KSM" msgstr "" #: share/virtualbricks.template.glade:11158 #: share/virtualbricks.template.glade:11195 msgid "Allow using the Kernel SamePage Merging support to enhance scalability" msgstr "" #: share/virtualbricks.template.glade:11173 #: share/virtualbricks.template.glade:11210 msgid "Use kqemu" msgstr "" #: share/virtualbricks.template.glade:11177 #: share/virtualbricks.template.glade:11214 msgid "Use old kqemu support" msgstr "" #: share/virtualbricks.template.glade:11191 #: share/virtualbricks.template.glade:11228 msgid "X86 optimizations" msgstr "" #: share/virtualbricks.template.glade:11208 #: share/virtualbricks.template.glade:11245 msgid "CD-Rom/DVD/Floppy Devices" msgstr "" #: share/virtualbricks.template.glade:11228 #: share/virtualbricks.template.glade:11265 msgid "" "Add your \"real\" physical drive volumes like CDR, DVD or Floppy devices " "here." msgstr "" #: share/virtualbricks.template.glade:11245 #: share/virtualbricks.template.glade:11282 msgid "Name: " msgstr "" #: share/virtualbricks.template.glade:11266 #: share/virtualbricks.template.glade:11303 msgid "Device Path: " msgstr "" #: share/virtualbricks.template.glade:11286 #: share/virtualbricks.template.glade:11323 msgid "Add" msgstr "" #: share/virtualbricks.template.glade:11330 #: share/virtualbricks.template.glade:11367 msgid "Qemu/KVM " msgstr "" #: share/virtualbricks.template.glade:11417 #: share/virtualbricks.template.glade:11454 msgid "Add Bookmark" msgstr "" #: share/virtualbricks.template.glade:11431 #: share/virtualbricks.template.glade:11468 msgid "Name:" msgstr "" #: share/virtualbricks.template.glade:11456 #: share/virtualbricks.template.glade:11493 msgid "Path:" msgstr "" #: share/virtualbricks.template.glade:11485 #: share/virtualbricks.template.glade:11522 msgid "Select A Icon" msgstr "" #: share/virtualbricks.template.glade:11495 #: share/virtualbricks.template.glade:11532 msgid "Icon for this Machine" msgstr "" #: share/virtualbricks.template.glade:11575 #: share/virtualbricks.template.glade:12064 #: share/virtualbricks.template.glade:11612 #: share/virtualbricks.template.glade:12101 msgid "show qemu volume info for selected image" msgstr "" #: share/virtualbricks.template.glade:11590 #: share/virtualbricks.template.glade:11627 msgid "remove this entry from My Machines" msgstr "" #: share/virtualbricks.template.glade:11600 #: share/virtualbricks.template.glade:11637 msgid "About: Virtualbricks" msgstr "" #: share/virtualbricks.template.glade:11656 #: share/virtualbricks.template.glade:11693 msgid "" "Virtualbricks is a GNU/Linux desktop gui for Qemu/KVM and Virtual " "Distributed Ethernet.\n" "\n" "Virtualbricks is licensed under the terms of the GPL (General Public " "Licence) Version 2.\n" "© 2011 Daniele Lacamera, Rainer Haage and the virtualbricks team on " "Launchpad. \n" "\n" "VDE - Virtual Distributed Ethernet - © 2003-2011 Renzo Davoli.\n" "QEMU - Copyright © 2005-2011 Fabrice Bellard.\n" "QEMU is a trademark of Fabrice Bellard.\n" "\n" "Icons for remote hosts are Copyleft David Vignoni - http://www.icon-king." "com/ License: LGPL\n" "\n" "If you find virtualbricks useful for your business, please consider making a " "donation." msgstr "" #: share/virtualbricks.template.glade:11713 #: share/virtualbricks.template.glade:11750 msgid "create new empty image" msgstr "" #: share/virtualbricks.template.glade:11730 #: share/virtualbricks.template.glade:11767 msgid "create new empty Disk image\n" msgstr "" #: share/virtualbricks.template.glade:11743 #: share/virtualbricks.template.glade:11780 msgid "Target Folder for the new image" msgstr "" #: share/virtualbricks.template.glade:11753 #: share/virtualbricks.template.glade:11790 msgid "Select A Directory" msgstr "" #: share/virtualbricks.template.glade:11776 #: share/virtualbricks.template.glade:11813 msgid "Name of the new image (or base image)" msgstr "" #: share/virtualbricks.template.glade:11791 #: share/virtualbricks.template.glade:11828 msgid "Enter a filename for the new image" msgstr "" #: share/virtualbricks.template.glade:11822 #: share/virtualbricks.template.glade:11859 msgid "Image format" msgstr "" #: share/virtualbricks.template.glade:11833 #: share/virtualbricks.template.glade:11870 msgid "" "Auto\n" "raw\n" "qcow\n" "qcow2\n" "cow\n" "vmdk\n" "cloop" msgstr "" #: share/virtualbricks.template.glade:11860 #: share/virtualbricks.template.glade:11897 msgid "Size" msgstr "" #: share/virtualbricks.template.glade:11875 #: share/virtualbricks.template.glade:11912 msgid "Size of the new image" msgstr "" #: share/virtualbricks.template.glade:11889 #: share/virtualbricks.template.glade:11926 msgid "" "KB\n" "MB\n" "GB" msgstr "" #: share/virtualbricks.template.glade:11949 #: share/virtualbricks.template.glade:11986 msgid "Create" msgstr "" #: share/virtualbricks.template.glade:11999 #: share/virtualbricks.template.glade:12036 msgid "message" msgstr "" #: share/virtualbricks.template.glade:12074 #: share/virtualbricks.template.glade:12111 msgid "add this image to bookmarks" msgstr "" #: share/virtualbricks.template.glade:12084 #: share/virtualbricks.template.glade:12121 msgid "Control monitor" msgstr "" #: share/virtualbricks.template.glade:12099 #: share/virtualbricks.template.glade:12136 msgid "control monitor for selected qemu job" msgstr "" #: share/virtualbricks.template.glade:12115 #: share/virtualbricks.template.glade:12152 msgid "kill emulation immediately" msgstr "" #: share/virtualbricks.template.glade:12128 #: share/virtualbricks.template.glade:12165 msgid "reset emulation" msgstr "" #: share/virtualbricks.template.glade:12149 #: share/virtualbricks.template.glade:12186 msgid "pause emulation" msgstr "" #: share/virtualbricks.template.glade:12162 #: share/virtualbricks.template.glade:12199 msgid "resume emulation" msgstr "" #: share/virtualbricks.template.glade:12190 #: share/virtualbricks.template.glade:12227 msgid "Available block devices" msgstr "" #: share/virtualbricks.template.glade:12208 #: share/virtualbricks.template.glade:12245 msgid "" "This is a list of all blockdevices used by the emulation. Rightclick an " "entry to eject. (hd volumes normally can not be ejected)" msgstr "" #: share/virtualbricks.template.glade:12222 #: share/virtualbricks.template.glade:12259 msgid "change soure of block devices" msgstr "" #: share/virtualbricks.template.glade:12238 #: share/virtualbricks.template.glade:12253 #: share/virtualbricks.template.glade:12270 #: share/virtualbricks.template.glade:12275 #: share/virtualbricks.template.glade:12290 #: share/virtualbricks.template.glade:12307 msgid "Change" msgstr "" #: share/virtualbricks.template.glade:12242 #: share/virtualbricks.template.glade:12279 msgid "change the source for qemu cdrom device to the selected image or drive" msgstr "" #: share/virtualbricks.template.glade:12257 #: share/virtualbricks.template.glade:12294 msgid "" "change the source for qemu floppy A device to the selected image or drive" msgstr "" #: share/virtualbricks.template.glade:12274 #: share/virtualbricks.template.glade:12311 msgid "" "change the source for qemu floppy B device to the selected image or drive" msgstr "" #: share/virtualbricks.template.glade:12289 #: share/virtualbricks.template.glade:12326 msgid "cdrom" msgstr "" #: share/virtualbricks.template.glade:12332 #: share/virtualbricks.template.glade:12345 #: share/virtualbricks.template.glade:12361 #: share/virtualbricks.template.glade:12369 #: share/virtualbricks.template.glade:12382 #: share/virtualbricks.template.glade:12398 msgid "None" msgstr "" #: share/virtualbricks.template.glade:12397 #: share/virtualbricks.template.glade:12434 msgid "Available host usb devices" msgstr "" #: share/virtualbricks.template.glade:12415 #: share/virtualbricks.template.glade:12452 msgid "" "All available host usb-devices. rightclick to attach a device to the virtual " "engine (you must have write access to /proc/bus/usb to attach devices)" msgstr "" #: share/virtualbricks.template.glade:12429 #: share/virtualbricks.template.glade:12466 msgid "Attached guest usb devices" msgstr "" #: share/virtualbricks.template.glade:12447 #: share/virtualbricks.template.glade:12484 msgid "" "All attached usb devices for this emulation. Rightclick to detach a device" msgstr "" #: share/virtualbricks.template.glade:12466 #: share/virtualbricks.template.glade:12503 msgid "USB" msgstr "" #: share/virtualbricks.template.glade:12478 #: share/virtualbricks.template.glade:12515 msgid "coming soon..." msgstr "" #: share/virtualbricks.template.glade:12488 #: share/virtualbricks.template.glade:12525 msgid "Emulation" msgstr "" #: share/virtualbricks.template.glade:12540 #: share/virtualbricks.template.glade:12577 msgid "open control monitor" msgstr "" #: share/virtualbricks.template.glade:12577 #: share/virtualbricks.template.glade:12614 msgid "Suspend Qemu" msgstr "" #: share/virtualbricks.template.glade:12586 #: share/virtualbricks.template.glade:12623 msgid "Send ACPI poweroff" msgstr "" #: share/virtualbricks.template.glade:12595 #: share/virtualbricks.template.glade:12632 msgid "Send ACPI hard reset" msgstr "" #: share/virtualbricks.template.glade:12651 #: share/virtualbricks.template.glade:12688 msgid "eject / unmount selected device" msgstr "" #: share/virtualbricks.template.glade:12659 #: share/virtualbricks.template.glade:12696 msgid "Setup new network card" msgstr "" #: share/virtualbricks.template.glade:12672 #: share/virtualbricks.template.glade:12709 msgid "Network Type" msgstr "" #: share/virtualbricks.template.glade:12684 #: share/virtualbricks.template.glade:12721 msgid "" "Open a TUN/TAP interface\n" "Use an already open TUN/TAP interface\n" "Open a listening TCP socket\n" "Use an already open TCP socket\n" "Connect to listening TCP socket\n" "Create shared VLAN via UDP multicast socket\n" "Use an already open UDP multicast socket" msgstr "" #: share/virtualbricks.template.glade:12719 #: share/virtualbricks.template.glade:12756 msgid "IP address: " msgstr "" #: share/virtualbricks.template.glade:12730 #: share/virtualbricks.template.glade:12767 msgid "MAC address: " msgstr "" #: share/virtualbricks.template.glade:12771 #: share/virtualbricks.template.glade:12808 msgid "VLAN:" msgstr "" #: share/virtualbricks.template.glade:12852 #: share/virtualbricks.template.glade:12889 msgid "TUN/TAP configuration script:" msgstr "" #: share/virtualbricks.template.glade:12863 #: share/virtualbricks.template.glade:12900 msgid "Name of network interface:" msgstr "" #: share/virtualbricks.template.glade:12947 #: share/virtualbricks.template.glade:12984 msgid "File descriptor: " msgstr "" #: share/virtualbricks.template.glade:13026 #: share/virtualbricks.template.glade:13063 msgid "Request" msgstr "" #: share/virtualbricks.template.glade:13054 #: share/virtualbricks.template.glade:14382 #: share/virtualbricks.template.glade:13091 #: share/virtualbricks.template.glade:14419 msgid "Are you sure?" msgstr "" #: share/virtualbricks.template.glade:13113 #: share/virtualbricks.template.glade:13150 msgid "Add redirect" msgstr "" #: share/virtualbricks.template.glade:13138 #: share/virtualbricks.template.glade:13175 msgid "TCP" msgstr "" #: share/virtualbricks.template.glade:13154 #: share/virtualbricks.template.glade:13191 msgid "UDP" msgstr "" #: share/virtualbricks.template.glade:13177 #: share/virtualbricks.template.glade:13225 #: share/virtualbricks.template.glade:13214 #: share/virtualbricks.template.glade:13262 msgid "port " msgstr "" #: share/virtualbricks.template.glade:13202 #: share/virtualbricks.template.glade:13239 msgid "to guest IP " msgstr "" #: share/virtualbricks.template.glade:13254 #: share/virtualbricks.template.glade:13291 msgid "Add redirect(s)" msgstr "" #: share/virtualbricks.template.glade:13324 #: share/virtualbricks.template.glade:13361 msgid "Mode:" msgstr "" #: share/virtualbricks.template.glade:13336 #: share/virtualbricks.template.glade:13373 msgid "DHCP" msgstr "" #: share/virtualbricks.template.glade:13349 #: share/virtualbricks.template.glade:13386 msgid "Manual" msgstr "" #: share/virtualbricks.template.glade:13387 #: share/virtualbricks.template.glade:13424 msgid "Address:" msgstr "" #: share/virtualbricks.template.glade:13393 #: share/virtualbricks.template.glade:13430 msgid "Netmask:" msgstr "" #: share/virtualbricks.template.glade:13437 #: share/virtualbricks.template.glade:13474 msgid "Advanced" msgstr "" #: share/virtualbricks.template.glade:13458 #: share/virtualbricks.template.glade:13887 #: share/virtualbricks.template.glade:14242 #: share/virtualbricks.template.glade:13495 #: share/virtualbricks.template.glade:13924 #: share/virtualbricks.template.glade:14279 msgid "Cancel" msgstr "" #: share/virtualbricks.template.glade:13471 #: share/virtualbricks.template.glade:13902 #: share/virtualbricks.template.glade:14257 #: share/virtualbricks.template.glade:13508 #: share/virtualbricks.template.glade:13939 #: share/virtualbricks.template.glade:14294 msgid "Ok" msgstr "" #: share/virtualbricks.template.glade:13537 #: share/virtualbricks.template.glade:13574 msgid "Switch" msgstr "" #: share/virtualbricks.template.glade:13576 #: share/virtualbricks.template.glade:13613 msgid "Wire" msgstr "" #: share/virtualbricks.template.glade:13615 #: share/virtualbricks.template.glade:13652 msgid "Wirefilter" msgstr "" #: share/virtualbricks.template.glade:13654 #: share/virtualbricks.template.glade:13691 msgid "Tap" msgstr "" #: share/virtualbricks.template.glade:13702 #: share/virtualbricks.template.glade:13739 msgid "Tunnel Client" msgstr "" #: share/virtualbricks.template.glade:13741 #: share/virtualbricks.template.glade:13778 msgid "Virtual Machine" msgstr "" #: share/virtualbricks.template.glade:13805 #: share/virtualbricks.template.glade:13842 msgid "Run on remote host:" msgstr "" #: share/virtualbricks.template.glade:13853 #: share/virtualbricks.template.glade:13890 msgid "Brick name:" msgstr "" #: share/virtualbricks.template.glade:13931 #: share/virtualbricks.template.glade:13968 msgid "Event type selection" msgstr "" #: share/virtualbricks.template.glade:13978 #: share/virtualbricks.template.glade:14015 msgid "Brick Start" msgstr "" #: share/virtualbricks.template.glade:14016 #: share/virtualbricks.template.glade:14053 msgid "Brick Stop" msgstr "" #: share/virtualbricks.template.glade:14055 #: share/virtualbricks.template.glade:14092 msgid "Brick Config" msgstr "" #: share/virtualbricks.template.glade:14093 #: share/virtualbricks.template.glade:14130 msgid "" "Free\n" "Shell Command" msgstr "" #: share/virtualbricks.template.glade:14141 #: share/virtualbricks.template.glade:14178 msgid "Events Collation" msgstr "" #: share/virtualbricks.template.glade:14184 #: share/virtualbricks.template.glade:14221 msgid "Event name:" msgstr "" #: share/virtualbricks.template.glade:14214 #: share/virtualbricks.template.glade:14251 msgid "10" msgstr "" #: share/virtualbricks.template.glade:14290 #: share/virtualbricks.template.glade:14745 #: share/virtualbricks.template.glade:14327 #: share/virtualbricks.template.glade:14782 msgid " " msgstr "" #: share/virtualbricks.template.glade:14301 #: share/virtualbricks.template.glade:14756 #: share/virtualbricks.template.glade:14338 #: share/virtualbricks.template.glade:14793 msgid "_Start/Stop" msgstr "" #: share/virtualbricks.template.glade:14309 #: share/virtualbricks.template.glade:14764 #: share/virtualbricks.template.glade:14346 #: share/virtualbricks.template.glade:14801 msgid "_Delete" msgstr "" #: share/virtualbricks.template.glade:14317 #: share/virtualbricks.template.glade:14772 #: share/virtualbricks.template.glade:14354 #: share/virtualbricks.template.glade:14809 msgid "Make a C_opy" msgstr "" #: share/virtualbricks.template.glade:14325 #: share/virtualbricks.template.glade:14780 #: share/virtualbricks.template.glade:14362 #: share/virtualbricks.template.glade:14817 msgid "Re_name" msgstr "" #: share/virtualbricks.template.glade:14333 #: share/virtualbricks.template.glade:14788 #: share/virtualbricks.template.glade:14370 #: share/virtualbricks.template.glade:14825 msgid "_Configure" msgstr "" #: share/virtualbricks.template.glade:14342 #: share/virtualbricks.template.glade:14379 msgid "_Resume VM" msgstr "" #: share/virtualbricks.template.glade:14350 #: share/virtualbricks.template.glade:14387 msgid "_Attach Event" msgstr "" #: share/virtualbricks.template.glade:14390 #: share/virtualbricks.template.glade:14427 msgid "Confirm Action" msgstr "" #: share/virtualbricks.template.glade:14465 #: share/virtualbricks.template.glade:14813 #: share/virtualbricks.template.glade:14502 #: share/virtualbricks.template.glade:14850 msgid "Choose a new name:" msgstr "" #: share/virtualbricks.template.glade:14532 #: share/virtualbricks.template.glade:14569 msgid "Virtualbricks: action in progress" msgstr "" #: share/virtualbricks.template.glade:14547 #: share/virtualbricks.template.glade:14584 msgid "Please wait" msgstr "" #: share/virtualbricks.template.glade:14576 #: share/virtualbricks.template.glade:14613 msgid "Select Image file" msgstr "" #: share/virtualbricks.template.glade:14637 #: share/virtualbricks.template.glade:14674 msgid "Toggle window" msgstr "" #: share/virtualbricks.template.glade:14650 #: share/virtualbricks.template.glade:14687 msgid "Close VB" msgstr "" #: share/virtualbricks.template.glade:14658 #: share/virtualbricks.template.glade:14695 msgid "Shell command actions" msgstr "" #: share/virtualbricks.template.glade:14675 #: share/virtualbricks.template.glade:14712 msgid "" "Enter shell command:\n" "(each line is an action)" msgstr "" #: share/virtualbricks.template.glade:14796 #: share/virtualbricks.template.glade:14833 msgid "New event name" msgstr "" #: share/virtualbricks.template.glade:14881 #: share/virtualbricks.template.glade:14918 msgid "Bricks to add to the event" msgstr "" #: share/virtualbricks.template.glade:14917 #: share/virtualbricks.template.glade:14954 msgid "Bricks available" msgstr "" #: share/virtualbricks.template.glade:14942 #: share/virtualbricks.template.glade:14979 msgid "" "--->\n" "<---" msgstr "" #: share/virtualbricks.template.glade:15013 #: share/virtualbricks.template.glade:15050 msgid "Bricks added" msgstr "" #: share/virtualbricks.template.glade:15077 #: share/virtualbricks.template.glade:15114 msgid "Messages" msgstr "" #: share/virtualbricks.template.glade:15203 #: share/virtualbricks.template.glade:15240 msgid "Start Event selection" msgstr "" #: share/virtualbricks.template.glade:15217 #: share/virtualbricks.template.glade:15282 #: share/virtualbricks.template.glade:15254 #: share/virtualbricks.template.glade:15319 msgid "Assign Nothing" msgstr "" #: share/virtualbricks.template.glade:15268 #: share/virtualbricks.template.glade:15305 msgid "Stop Event selection" msgstr "" #: share/virtualbricks.template.glade:15354 #: share/virtualbricks.template.glade:15391 msgid "Connect/Disconnect" msgstr "" #: share/virtualbricks.template.glade:15362 #: share/virtualbricks.template.glade:15399 msgid "Change Password" msgstr "" #: share/virtualbricks.template.glade:15370 #: share/virtualbricks.template.glade:15407 msgid "Auto-connect at startup" msgstr "" #: share/virtualbricks.template.glade:15378 #: share/virtualbricks.template.glade:15415 msgid "Delete" msgstr "" #: share/virtualbricks.template.glade:15384 #: share/virtualbricks.template.glade:15421 msgid "Authentication" msgstr "" #: share/virtualbricks.template.glade:15397 #: share/virtualbricks.template.glade:15434 msgid "Password for remote virtualbricks session:" msgstr "" #: virtualbricks/brickfactory.py:532 virtualbricks/brickfactory.py:584 #, python-format msgid "Starting: '%s'" msgstr "" #: virtualbricks/brickfactory.py:565 virtualbricks/brickfactory.py:623 #, python-format msgid "Shutting down %s" msgstr "" #: virtualbricks/brickfactory.py:576 #, python-format msgid "can not stop brick (error code: '%s')" msgstr "" #: virtualbricks/brickfactory.py:582 virtualbricks/brickfactory.py:638 #, python-format msgid "can not send SIGTERM: '%s'" msgstr "" #: virtualbricks/brickfactory.py:646 virtualbricks/brickfactory.py:709 msgid "Error: cannot start a terminal emulator" msgstr "" #: virtualbricks/brickfactory.py:651 virtualbricks/brickfactory.py:714 msgid "Error running command line" msgstr "" #: virtualbricks/brickfactory.py:658 virtualbricks/brickfactory.py:721 msgid "does not have a console" msgstr "" #: virtualbricks/brickfactory.py:669 virtualbricks/brickfactory.py:732 msgid "error opening internal console" msgstr "" #: virtualbricks/brickfactory.py:714 virtualbricks/brickfactory.py:771 #: virtualbricks/brickfactory.py:777 virtualbricks/brickfactory.py:834 msgid "running" msgstr "" #: virtualbricks/brickfactory.py:716 virtualbricks/brickfactory.py:1019 #: virtualbricks/brickfactory.py:1081 virtualbricks/brickfactory.py:1086 #: virtualbricks/brickfactory.py:1088 virtualbricks/brickfactory.py:1825 #: virtualbricks/brickfactory.py:1877 virtualbricks/brickfactory.py:779 #: virtualbricks/brickfactory.py:1082 virtualbricks/brickfactory.py:1144 #: virtualbricks/brickfactory.py:1149 virtualbricks/brickfactory.py:1151 #: virtualbricks/brickfactory.py:1888 virtualbricks/brickfactory.py:1940 msgid "disconnected" msgstr "" #: virtualbricks/brickfactory.py:718 virtualbricks/brickfactory.py:775 #: virtualbricks/brickfactory.py:781 virtualbricks/brickfactory.py:838 msgid "off" msgstr "" #: virtualbricks/brickfactory.py:773 virtualbricks/brickfactory.py:836 msgid "unconfigured" msgstr "" #: virtualbricks/brickfactory.py:798 virtualbricks/brickfactory.py:861 msgid "Error: config line must contain add OR addsh." msgstr "" #: virtualbricks/brickfactory.py:806 virtualbricks/brickfactory.py:869 #, python-format msgid "Added vb-shell command: '%s'" msgstr "" #: virtualbricks/brickfactory.py:813 virtualbricks/brickfactory.py:876 #, python-format msgid "Added host-shell command: '%s'" msgstr "" #: virtualbricks/brickfactory.py:956 virtualbricks/brickfactory.py:1019 msgid "Ports:" msgstr "" #: virtualbricks/brickfactory.py:1017 virtualbricks/brickfactory.py:1080 #, python-format msgid "plugged to %s " msgstr "" #: virtualbricks/brickfactory.py:1089 virtualbricks/brickfactory.py:1152 msgid "Configured to connect" msgstr "" #: virtualbricks/brickfactory.py:1091 virtualbricks/brickfactory.py:1154 msgid "Not yet configured." msgstr "" #: virtualbricks/brickfactory.py:1092 virtualbricks/brickfactory.py:1155 msgid "Left plug is" msgstr "" #: virtualbricks/brickfactory.py:1092 virtualbricks/brickfactory.py:1155 msgid "and right plug is" msgstr "" #: virtualbricks/brickfactory.py:1823 virtualbricks/brickfactory.py:1874 #: virtualbricks/brickfactory.py:1886 virtualbricks/brickfactory.py:1937 msgid "plugged to" msgstr "" #: virtualbricks/brickfactory.py:1824 virtualbricks/brickfactory.py:1887 msgid "listening to udp:" msgstr "" #: virtualbricks/brickfactory.py:1875 virtualbricks/brickfactory.py:1938 msgid ", connecting to udp://" msgstr "" #: virtualbricks/brickfactory.py:2146 virtualbricks/brickfactory.py:2209 msgid "command:" msgstr "" #: virtualbricks/brickfactory.py:2781 virtualbricks/brickfactory.py:2857 msgid "Engine: Bye!" msgstr "" #: virtualbricks/gui/gui.py:107 msgid "PID" msgstr "" #: virtualbricks/gui/gui.py:107 virtualbricks/gui/gui.py:109 #: virtualbricks/gui/gui.py:199 virtualbricks/gui/gui.py:221 #: virtualbricks/gui/gui.py:1138 virtualbricks/gui/gui.py:1160 #: virtualbricks/gui/gui.py:2753 virtualbricks/gui/gui.py:2775 #: virtualbricks/gui/gui.py:2726 virtualbricks/gui/gui.py:2748 #: virtualbricks/gui/gui.py:2746 virtualbricks/gui/gui.py:2768 #: virtualbricks/gui/gui.py:2754 virtualbricks/gui/gui.py:2776 #: virtualbricks/gui/gui.py:2761 virtualbricks/gui/gui.py:2783 #: virtualbricks/gui/gui.py:1140 virtualbricks/gui/gui.py:1162 #: virtualbricks/gui/gui.py:2763 virtualbricks/gui/gui.py:2785 #: virtualbricks/gui/gui.py:2765 virtualbricks/gui/gui.py:2787 #: virtualbricks/gui/gui.py:2739 msgid "Type" msgstr "" #: virtualbricks/gui/gui.py:107 virtualbricks/gui/gui.py:109 #: virtualbricks/gui/gui.py:204 virtualbricks/gui/gui.py:223 #: virtualbricks/gui/gui.py:1140 virtualbricks/gui/gui.py:1162 #: virtualbricks/gui/gui.py:2755 virtualbricks/gui/gui.py:2777 #: virtualbricks/gui/gui.py:2728 virtualbricks/gui/gui.py:2750 #: virtualbricks/gui/gui.py:2748 virtualbricks/gui/gui.py:2770 #: virtualbricks/gui/gui.py:2756 virtualbricks/gui/gui.py:2778 #: virtualbricks/gui/gui.py:2763 virtualbricks/gui/gui.py:2785 #: virtualbricks/gui/gui.py:1142 virtualbricks/gui/gui.py:1164 #: virtualbricks/gui/gui.py:2765 virtualbricks/gui/gui.py:2787 #: virtualbricks/gui/gui.py:2767 virtualbricks/gui/gui.py:2789 #: virtualbricks/gui/gui.py:2741 msgid "Name" msgstr "" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:119 #: virtualbricks/gui/gui.py:132 virtualbricks/gui/gui.py:181 #: virtualbricks/gui/gui.py:214 virtualbricks/gui/gui.py:1136 #: virtualbricks/gui/gui.py:1158 virtualbricks/gui/gui.py:2751 #: virtualbricks/gui/gui.py:2773 virtualbricks/gui/gui.py:2724 #: virtualbricks/gui/gui.py:2746 virtualbricks/gui/gui.py:2744 #: virtualbricks/gui/gui.py:2766 virtualbricks/gui/gui.py:2752 #: virtualbricks/gui/gui.py:2774 virtualbricks/gui/gui.py:2759 #: virtualbricks/gui/gui.py:2781 virtualbricks/gui/gui.py:1138 #: virtualbricks/gui/gui.py:1160 virtualbricks/gui/gui.py:2761 #: virtualbricks/gui/gui.py:2783 virtualbricks/gui/gui.py:2763 #: virtualbricks/gui/gui.py:2785 virtualbricks/gui/gui.py:2737 msgid "Icon" msgstr "" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:197 #: virtualbricks/gui/gui.py:219 msgid "Status" msgstr "" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:206 #: virtualbricks/gui/gui.py:225 virtualbricks/gui/gui.py:1142 #: virtualbricks/gui/gui.py:1164 virtualbricks/gui/gui.py:2757 #: virtualbricks/gui/gui.py:2779 virtualbricks/gui/gui.py:2730 #: virtualbricks/gui/gui.py:2752 virtualbricks/gui/gui.py:2750 #: virtualbricks/gui/gui.py:2772 virtualbricks/gui/gui.py:2758 #: virtualbricks/gui/gui.py:2780 virtualbricks/gui/gui.py:2765 #: virtualbricks/gui/gui.py:2787 virtualbricks/gui/gui.py:1144 #: virtualbricks/gui/gui.py:1166 virtualbricks/gui/gui.py:2767 #: virtualbricks/gui/gui.py:2789 virtualbricks/gui/gui.py:2769 #: virtualbricks/gui/gui.py:2791 virtualbricks/gui/gui.py:2743 msgid "Parameters" msgstr "" #: virtualbricks/gui/gui.py:115 msgid "Address" msgstr "" #: virtualbricks/gui/gui.py:115 msgid "Autoconnect" msgstr "" #: virtualbricks/gui/gui.py:332 virtualbricks/gui/gui.py:1091 #: virtualbricks/gui/gui.py:1093 msgid "Command" msgstr "" #: virtualbricks/gui/gui.py:336 virtualbricks/gui/gui.py:1095 #: virtualbricks/gui/gui.py:1097 msgid "Host shell command" msgstr "" #: virtualbricks/gui/gui.py:443 msgid "KVM is disabled from Properties" msgstr "" #: virtualbricks/gui/gui.py:729 msgid "Show Settings" msgstr "" #: virtualbricks/gui/gui.py:755 virtualbricks/gui/gui.py:792 msgid "Hide Settings" msgstr "" #: virtualbricks/gui/gui.py:1038 virtualbricks/gui/gui.py:1045 #: virtualbricks/gui/gui.py:1040 virtualbricks/gui/gui.py:1047 msgid "Cannot create brick: Invalid name." msgstr "" #: virtualbricks/gui/gui.py:1062 virtualbricks/gui/gui.py:1066 #: virtualbricks/gui/gui.py:1064 virtualbricks/gui/gui.py:1068 msgid "The name \"" msgstr "" #: virtualbricks/gui/gui.py:1062 virtualbricks/gui/gui.py:1064 msgid "\" has forbidden format." msgstr "" #: virtualbricks/gui/gui.py:1066 virtualbricks/gui/gui.py:1068 msgid "\" has been adapted to \"" msgstr "" #: virtualbricks/gui/gui.py:1070 virtualbricks/gui/gui.py:1072 msgid "An event named \"" msgstr "" #: virtualbricks/gui/gui.py:1070 virtualbricks/gui/gui.py:1072 msgid "\" already exist." msgstr "" #: virtualbricks/gui/gui.py:1174 virtualbricks/gui/gui.py:1176 msgid "Bricks to add to the event to be started" msgstr "" #: virtualbricks/gui/gui.py:1178 virtualbricks/gui/gui.py:1180 msgid "Bricks to add to the event to be stopped" msgstr "" #: virtualbricks/gui/gui.py:1182 virtualbricks/gui/gui.py:1184 msgid "Events to add to the event to be started" msgstr "" #: virtualbricks/gui/gui.py:1187 virtualbricks/gui/gui.py:1189 msgid "Cannot create event: Invalid name." msgstr "" #: virtualbricks/gui/gui.py:1311 virtualbricks/gui/gui.py:1313 msgid "Help for parameter:" msgstr "" #: virtualbricks/gui/gui.py:1316 msgid "\t\tCHANNEL BANDWIDTH\n" msgstr "" #: virtualbricks/gui/gui.py:1326 msgid "\t\tINTERFACE SPEED\n" msgstr "" #: virtualbricks/gui/gui.py:1336 msgid "\t\tDELAY\n" msgstr "" #: virtualbricks/gui/gui.py:1346 virtualbricks/gui/gui.py:1339 msgid "\t\tCHANNEL BUFFER SIZE\n" msgstr "" #: virtualbricks/gui/gui.py:1355 virtualbricks/gui/gui.py:1328 #: virtualbricks/gui/gui.py:1348 msgid "\t\tPACKET LOSS\n" msgstr "" #: virtualbricks/gui/gui.py:1363 virtualbricks/gui/gui.py:1336 #: virtualbricks/gui/gui.py:1356 msgid "\t\tPACKET DUPLICATION\n" msgstr "" #: virtualbricks/gui/gui.py:1372 virtualbricks/gui/gui.py:1345 #: virtualbricks/gui/gui.py:1365 msgid "\t\tNOISE\n" msgstr "" #: virtualbricks/gui/gui.py:1380 virtualbricks/gui/gui.py:1353 #: virtualbricks/gui/gui.py:1373 msgid "\t\tLOST BURST\n" msgstr "" #: virtualbricks/gui/gui.py:1389 virtualbricks/gui/gui.py:1362 #: virtualbricks/gui/gui.py:1382 msgid "\t\tMTU: MAXIMUM TRANSMISSION UNIT\n" msgstr "" #: virtualbricks/gui/gui.py:1613 virtualbricks/gui/gui.py:1586 #: virtualbricks/gui/gui.py:1606 virtualbricks/gui/gui.py:1614 #: virtualbricks/gui/gui.py:1621 virtualbricks/gui/gui.py:1623 #: virtualbricks/gui/gui.py:1625 virtualbricks/gui/gui.py:1599 #, python-format msgid "Cannot start '%s': not configured" msgstr "" #: virtualbricks/gui/gui.py:1618 virtualbricks/gui/gui.py:1591 #: virtualbricks/gui/gui.py:1611 virtualbricks/gui/gui.py:1619 #: virtualbricks/gui/gui.py:1626 virtualbricks/gui/gui.py:1628 #: virtualbricks/gui/gui.py:1630 virtualbricks/gui/gui.py:1604 #, python-format msgid "Cannot start '%s': not connected" msgstr "" #: virtualbricks/gui/gui.py:1624 virtualbricks/gui/gui.py:1597 #: virtualbricks/gui/gui.py:1617 virtualbricks/gui/gui.py:1625 #: virtualbricks/gui/gui.py:1632 virtualbricks/gui/gui.py:1634 #: virtualbricks/gui/gui.py:1636 virtualbricks/gui/gui.py:1610 msgid "" "Loop link detected: aborting operation. If you want to start a looped " "network, disable the check loop feature in the general settings" msgstr "" #: virtualbricks/gui/gui.py:1632 virtualbricks/gui/gui.py:1605 #: virtualbricks/gui/gui.py:1625 virtualbricks/gui/gui.py:1633 #: virtualbricks/gui/gui.py:1640 virtualbricks/gui/gui.py:1642 #: virtualbricks/gui/gui.py:1644 virtualbricks/gui/gui.py:1618 msgid "Disk used by the VM is locked by another machine" msgstr "" #: virtualbricks/gui/gui.py:1906 virtualbricks/gui/gui.py:1879 #: virtualbricks/gui/gui.py:1899 virtualbricks/gui/gui.py:1907 #: virtualbricks/gui/gui.py:1914 virtualbricks/gui/gui.py:1916 #: virtualbricks/gui/gui.py:1918 virtualbricks/gui/gui.py:1892 msgid "Choose a filename first!" msgstr "" #: virtualbricks/gui/gui.py:2095 virtualbricks/gui/gui.py:2068 #: virtualbricks/gui/gui.py:2088 virtualbricks/gui/gui.py:2096 #: virtualbricks/gui/gui.py:2103 virtualbricks/gui/gui.py:2105 #: virtualbricks/gui/gui.py:2107 virtualbricks/gui/gui.py:2081 msgid "No KVM binary found" msgstr "" #: virtualbricks/gui/gui.py:2095 virtualbricks/gui/gui.py:2098 #: virtualbricks/gui/gui.py:2068 virtualbricks/gui/gui.py:2071 #: virtualbricks/gui/gui.py:2088 virtualbricks/gui/gui.py:2091 #: virtualbricks/gui/gui.py:2096 virtualbricks/gui/gui.py:2099 #: virtualbricks/gui/gui.py:2103 virtualbricks/gui/gui.py:2106 #: virtualbricks/gui/gui.py:2105 virtualbricks/gui/gui.py:2108 #: virtualbricks/gui/gui.py:2107 virtualbricks/gui/gui.py:2110 #: virtualbricks/gui/gui.py:2081 virtualbricks/gui/gui.py:2084 msgid "Check your active configuration" msgstr "" #: virtualbricks/gui/gui.py:2095 virtualbricks/gui/gui.py:2098 #: virtualbricks/gui/gui.py:2068 virtualbricks/gui/gui.py:2071 #: virtualbricks/gui/gui.py:2088 virtualbricks/gui/gui.py:2091 #: virtualbricks/gui/gui.py:2096 virtualbricks/gui/gui.py:2099 #: virtualbricks/gui/gui.py:2103 virtualbricks/gui/gui.py:2106 #: virtualbricks/gui/gui.py:2105 virtualbricks/gui/gui.py:2108 #: virtualbricks/gui/gui.py:2107 virtualbricks/gui/gui.py:2110 #: virtualbricks/gui/gui.py:2081 virtualbricks/gui/gui.py:2084 msgid "KVM will stay disabled" msgstr "" #: virtualbricks/gui/gui.py:2098 virtualbricks/gui/gui.py:2071 #: virtualbricks/gui/gui.py:2091 virtualbricks/gui/gui.py:2099 #: virtualbricks/gui/gui.py:2106 virtualbricks/gui/gui.py:2108 #: virtualbricks/gui/gui.py:2110 virtualbricks/gui/gui.py:2084 msgid "No KVM support found on the system" msgstr "" #: virtualbricks/gui/gui.py:2106 virtualbricks/gui/gui.py:2079 #: virtualbricks/gui/gui.py:2099 virtualbricks/gui/gui.py:2107 #: virtualbricks/gui/gui.py:2114 virtualbricks/gui/gui.py:2116 #: virtualbricks/gui/gui.py:2118 virtualbricks/gui/gui.py:2092 msgid "No KSM support found on the system" msgstr "" #: virtualbricks/gui/gui.py:2106 virtualbricks/gui/gui.py:2079 #: virtualbricks/gui/gui.py:2099 virtualbricks/gui/gui.py:2107 #: virtualbricks/gui/gui.py:2114 virtualbricks/gui/gui.py:2116 #: virtualbricks/gui/gui.py:2118 virtualbricks/gui/gui.py:2092 msgid "Check your configuration" msgstr "" #: virtualbricks/gui/gui.py:2106 virtualbricks/gui/gui.py:2079 #: virtualbricks/gui/gui.py:2099 virtualbricks/gui/gui.py:2107 #: virtualbricks/gui/gui.py:2114 virtualbricks/gui/gui.py:2116 #: virtualbricks/gui/gui.py:2118 virtualbricks/gui/gui.py:2092 msgid "KSM will stay disabled" msgstr "" #: virtualbricks/gui/gui.py:2120 virtualbricks/gui/gui.py:2093 #: virtualbricks/gui/gui.py:2113 virtualbricks/gui/gui.py:2121 #: virtualbricks/gui/gui.py:2128 virtualbricks/gui/gui.py:2130 #: virtualbricks/gui/gui.py:2132 virtualbricks/gui/gui.py:2106 msgid "The brick is still running, it will be killed before being deleted!\n" msgstr "" #: virtualbricks/gui/gui.py:2122 virtualbricks/gui/gui.py:2095 #: virtualbricks/gui/gui.py:2115 virtualbricks/gui/gui.py:2123 #: virtualbricks/gui/gui.py:2130 virtualbricks/gui/gui.py:2132 #: virtualbricks/gui/gui.py:2134 virtualbricks/gui/gui.py:2108 msgid "Do you really want to delete " msgstr "" #: virtualbricks/gui/gui.py:2131 virtualbricks/gui/gui.py:2104 #: virtualbricks/gui/gui.py:2124 virtualbricks/gui/gui.py:2132 #: virtualbricks/gui/gui.py:2139 virtualbricks/gui/gui.py:2141 #: virtualbricks/gui/gui.py:2143 virtualbricks/gui/gui.py:2117 msgid "This event is in use" msgstr "" #: virtualbricks/gui/gui.py:2133 virtualbricks/gui/gui.py:2106 #: virtualbricks/gui/gui.py:2126 virtualbricks/gui/gui.py:2134 #: virtualbricks/gui/gui.py:2141 virtualbricks/gui/gui.py:2143 #: virtualbricks/gui/gui.py:2145 virtualbricks/gui/gui.py:2119 msgid "Do you really want to delete" msgstr "" #: virtualbricks/gui/gui.py:2143 virtualbricks/gui/gui.py:2116 #: virtualbricks/gui/gui.py:2136 virtualbricks/gui/gui.py:2144 #: virtualbricks/gui/gui.py:2151 virtualbricks/gui/gui.py:2153 #: virtualbricks/gui/gui.py:2155 virtualbricks/gui/gui.py:2129 msgid "Cannot rename Brick: it is in use." msgstr "" #: virtualbricks/gui/gui.py:2169 virtualbricks/gui/gui.py:2181 #: virtualbricks/gui/gui.py:2240 virtualbricks/gui/gui.py:2142 #: virtualbricks/gui/gui.py:2154 virtualbricks/gui/gui.py:2213 #: virtualbricks/gui/gui.py:2162 virtualbricks/gui/gui.py:2174 #: virtualbricks/gui/gui.py:2233 virtualbricks/gui/gui.py:2170 #: virtualbricks/gui/gui.py:2182 virtualbricks/gui/gui.py:2241 #: virtualbricks/gui/gui.py:2177 virtualbricks/gui/gui.py:2189 #: virtualbricks/gui/gui.py:2248 virtualbricks/gui/gui.py:2179 #: virtualbricks/gui/gui.py:2191 virtualbricks/gui/gui.py:2250 #: virtualbricks/gui/gui.py:2193 virtualbricks/gui/gui.py:2252 #: virtualbricks/gui/gui.py:2155 virtualbricks/gui/gui.py:2167 #: virtualbricks/gui/gui.py:2226 msgid "Invalid name!" msgstr "" #: virtualbricks/gui/gui.py:2175 virtualbricks/gui/gui.py:2148 #: virtualbricks/gui/gui.py:2168 virtualbricks/gui/gui.py:2176 #: virtualbricks/gui/gui.py:2183 virtualbricks/gui/gui.py:2185 #: virtualbricks/gui/gui.py:2187 virtualbricks/gui/gui.py:2161 msgid "Cannot rename Event: it is in use." msgstr "" #: virtualbricks/gui/gui.py:2286 virtualbricks/gui/gui.py:2295 #: virtualbricks/gui/gui.py:2325 virtualbricks/gui/gui.py:2259 #: virtualbricks/gui/gui.py:2268 virtualbricks/gui/gui.py:2298 #: virtualbricks/gui/gui.py:2279 virtualbricks/gui/gui.py:2288 #: virtualbricks/gui/gui.py:2318 virtualbricks/gui/gui.py:2287 #: virtualbricks/gui/gui.py:2296 virtualbricks/gui/gui.py:2326 #: virtualbricks/gui/gui.py:2294 virtualbricks/gui/gui.py:2303 #: virtualbricks/gui/gui.py:2333 virtualbricks/gui/gui.py:2305 #: virtualbricks/gui/gui.py:2335 virtualbricks/gui/gui.py:2307 #: virtualbricks/gui/gui.py:2337 virtualbricks/gui/gui.py:2272 #: virtualbricks/gui/gui.py:2281 virtualbricks/gui/gui.py:2311 msgid "Error" msgstr "" #: virtualbricks/gui/gui.py:2286 virtualbricks/gui/gui.py:2259 #: virtualbricks/gui/gui.py:2279 virtualbricks/gui/gui.py:2287 #: virtualbricks/gui/gui.py:2294 virtualbricks/gui/gui.py:2296 #: virtualbricks/gui/gui.py:2298 virtualbricks/gui/gui.py:2272 msgid "invalid path for qemu binaries" msgstr "" #: virtualbricks/gui/gui.py:2295 virtualbricks/gui/gui.py:2268 #: virtualbricks/gui/gui.py:2288 virtualbricks/gui/gui.py:2296 #: virtualbricks/gui/gui.py:2303 virtualbricks/gui/gui.py:2305 #: virtualbricks/gui/gui.py:2307 virtualbricks/gui/gui.py:2281 msgid "cannot find neither qemu nor kvm in this path" msgstr "" #: virtualbricks/gui/gui.py:2299 virtualbricks/gui/gui.py:2302 #: virtualbricks/gui/gui.py:2272 virtualbricks/gui/gui.py:2275 #: virtualbricks/gui/gui.py:2292 virtualbricks/gui/gui.py:2295 #: virtualbricks/gui/gui.py:2300 virtualbricks/gui/gui.py:2303 #: virtualbricks/gui/gui.py:2307 virtualbricks/gui/gui.py:2310 #: virtualbricks/gui/gui.py:2309 virtualbricks/gui/gui.py:2312 #: virtualbricks/gui/gui.py:2311 virtualbricks/gui/gui.py:2314 #: virtualbricks/gui/gui.py:2285 virtualbricks/gui/gui.py:2288 msgid "Warning" msgstr "" #: virtualbricks/gui/gui.py:2299 virtualbricks/gui/gui.py:2272 #: virtualbricks/gui/gui.py:2292 virtualbricks/gui/gui.py:2300 #: virtualbricks/gui/gui.py:2307 virtualbricks/gui/gui.py:2309 #: virtualbricks/gui/gui.py:2311 virtualbricks/gui/gui.py:2285 msgid "cannot find qemu, using kvm only\n" msgstr "" #: virtualbricks/gui/gui.py:2302 virtualbricks/gui/gui.py:2275 #: virtualbricks/gui/gui.py:2295 virtualbricks/gui/gui.py:2303 #: virtualbricks/gui/gui.py:2310 virtualbricks/gui/gui.py:2312 #: virtualbricks/gui/gui.py:2314 virtualbricks/gui/gui.py:2288 msgid "kvm not found" msgstr "" #: virtualbricks/gui/gui.py:2302 virtualbricks/gui/gui.py:2275 #: virtualbricks/gui/gui.py:2295 virtualbricks/gui/gui.py:2303 #: virtualbricks/gui/gui.py:2310 virtualbricks/gui/gui.py:2312 #: virtualbricks/gui/gui.py:2314 virtualbricks/gui/gui.py:2288 msgid "KVM support disabled" msgstr "" #: virtualbricks/gui/gui.py:2304 virtualbricks/gui/gui.py:2277 #: virtualbricks/gui/gui.py:2297 virtualbricks/gui/gui.py:2305 #: virtualbricks/gui/gui.py:2312 virtualbricks/gui/gui.py:2314 #: virtualbricks/gui/gui.py:2316 virtualbricks/gui/gui.py:2290 msgid "KVM and Qemu detected" msgstr "" #: virtualbricks/gui/gui.py:2316 virtualbricks/gui/gui.py:2289 #: virtualbricks/gui/gui.py:2309 virtualbricks/gui/gui.py:2317 #: virtualbricks/gui/gui.py:2324 virtualbricks/gui/gui.py:2326 #: virtualbricks/gui/gui.py:2328 virtualbricks/gui/gui.py:2302 msgid "additional targets supported" msgstr "" #: virtualbricks/gui/gui.py:2325 virtualbricks/gui/gui.py:2298 #: virtualbricks/gui/gui.py:2318 virtualbricks/gui/gui.py:2326 #: virtualbricks/gui/gui.py:2333 virtualbricks/gui/gui.py:2335 #: virtualbricks/gui/gui.py:2337 virtualbricks/gui/gui.py:2311 msgid "invalid path for vde binaries" msgstr "" #: virtualbricks/gui/gui.py:2327 virtualbricks/gui/gui.py:2300 #: virtualbricks/gui/gui.py:2320 virtualbricks/gui/gui.py:2328 #: virtualbricks/gui/gui.py:2335 virtualbricks/gui/gui.py:2337 #: virtualbricks/gui/gui.py:2339 virtualbricks/gui/gui.py:2313 msgid "Warning, missing modules" msgstr "" #: virtualbricks/gui/gui.py:2332 virtualbricks/gui/gui.py:2305 #: virtualbricks/gui/gui.py:2325 virtualbricks/gui/gui.py:2333 #: virtualbricks/gui/gui.py:2340 virtualbricks/gui/gui.py:2342 #: virtualbricks/gui/gui.py:2344 virtualbricks/gui/gui.py:2318 msgid "All VDE components detected" msgstr "" #: virtualbricks/gui/gui.py:2398 virtualbricks/gui/gui.py:2371 #: virtualbricks/gui/gui.py:2391 virtualbricks/gui/gui.py:2399 #: virtualbricks/gui/gui.py:2406 virtualbricks/gui/gui.py:2408 #: virtualbricks/gui/gui.py:2410 virtualbricks/gui/gui.py:2384 msgid "" "No KVM binary found. Check your active configuration. KVM will stay disabled." msgstr "" #: virtualbricks/gui/gui.py:2401 virtualbricks/gui/gui.py:2374 #: virtualbricks/gui/gui.py:2394 virtualbricks/gui/gui.py:2402 #: virtualbricks/gui/gui.py:2409 virtualbricks/gui/gui.py:2411 #: virtualbricks/gui/gui.py:2413 virtualbricks/gui/gui.py:2387 msgid "" "No KVM support found on the system. Check your active configuration. KVM " "will stay disabled." msgstr "" #: virtualbricks/gui/gui.py:2572 virtualbricks/gui/gui.py:2545 #: virtualbricks/gui/gui.py:2565 virtualbricks/gui/gui.py:2573 #: virtualbricks/gui/gui.py:2580 virtualbricks/gui/gui.py:2582 #: virtualbricks/gui/gui.py:2584 virtualbricks/gui/gui.py:2558 msgid "Suspend/Resume not supported on this disk." msgstr "" #: virtualbricks/gui/gui.py:2597 virtualbricks/gui/gui.py:2570 #: virtualbricks/gui/gui.py:2590 virtualbricks/gui/gui.py:2598 #: virtualbricks/gui/gui.py:2605 virtualbricks/gui/gui.py:2607 #: virtualbricks/gui/gui.py:2609 virtualbricks/gui/gui.py:2583 msgid "Cannot find suspend point." msgstr "" #: virtualbricks/gui/gui.py:2629 virtualbricks/gui/gui.py:2602 #: virtualbricks/gui/gui.py:2622 virtualbricks/gui/gui.py:2630 #: virtualbricks/gui/gui.py:2637 virtualbricks/gui/gui.py:2639 #: virtualbricks/gui/gui.py:2641 virtualbricks/gui/gui.py:2615 msgid "Error saving topology: Invalid image format" msgstr "" #: virtualbricks/gui/gui.py:2631 virtualbricks/gui/gui.py:2604 #: virtualbricks/gui/gui.py:2624 virtualbricks/gui/gui.py:2632 #: virtualbricks/gui/gui.py:2639 virtualbricks/gui/gui.py:2641 #: virtualbricks/gui/gui.py:2643 virtualbricks/gui/gui.py:2617 msgid "Error saving topology: Could not write file" msgstr "" #: virtualbricks/gui/gui.py:2633 virtualbricks/gui/gui.py:2606 #: virtualbricks/gui/gui.py:2626 virtualbricks/gui/gui.py:2634 #: virtualbricks/gui/gui.py:2641 virtualbricks/gui/gui.py:2643 #: virtualbricks/gui/gui.py:2645 virtualbricks/gui/gui.py:2619 msgid "Error saving topology: Unknown error" msgstr "" #: virtualbricks/gui/gui.py:2788 virtualbricks/gui/gui.py:2761 #: virtualbricks/gui/gui.py:2781 virtualbricks/gui/gui.py:2789 #: virtualbricks/gui/gui.py:2796 virtualbricks/gui/gui.py:2798 #: virtualbricks/gui/gui.py:2800 virtualbricks/gui/gui.py:2774 msgid "Virtualbricks-Events to attach to the start/stop Brick Events" msgstr "" #: virtualbricks/gui/gui.py:2794 virtualbricks/gui/gui.py:2767 #: virtualbricks/gui/gui.py:2787 virtualbricks/gui/gui.py:2795 #: virtualbricks/gui/gui.py:2802 virtualbricks/gui/gui.py:2804 #: virtualbricks/gui/gui.py:2806 virtualbricks/gui/gui.py:2780 msgid "Save current project?" msgstr "" #: virtualbricks/gui/gui.py:2797 virtualbricks/gui/gui.py:2770 #: virtualbricks/gui/gui.py:2790 virtualbricks/gui/gui.py:2798 #: virtualbricks/gui/gui.py:2805 virtualbricks/gui/gui.py:2807 #: virtualbricks/gui/gui.py:2809 virtualbricks/gui/gui.py:2783 msgid "Open a project" msgstr "" #: virtualbricks/gui/gui.py:2800 virtualbricks/gui/gui.py:2820 #: virtualbricks/gui/gui.py:2850 virtualbricks/gui/gui.py:2773 #: virtualbricks/gui/gui.py:2793 virtualbricks/gui/gui.py:2823 #: virtualbricks/gui/gui.py:2813 virtualbricks/gui/gui.py:2843 #: virtualbricks/gui/gui.py:2801 virtualbricks/gui/gui.py:2821 #: virtualbricks/gui/gui.py:2851 virtualbricks/gui/gui.py:2808 #: virtualbricks/gui/gui.py:2828 virtualbricks/gui/gui.py:2858 #: virtualbricks/gui/gui.py:2810 virtualbricks/gui/gui.py:2830 #: virtualbricks/gui/gui.py:2860 virtualbricks/gui/gui.py:2812 #: virtualbricks/gui/gui.py:2832 virtualbricks/gui/gui.py:2862 #: virtualbricks/gui/gui.py:2786 virtualbricks/gui/gui.py:2806 #: virtualbricks/gui/gui.py:2836 msgid "Virtualbricks Bricks List" msgstr "" #: virtualbricks/gui/gui.py:2804 virtualbricks/gui/gui.py:2824 #: virtualbricks/gui/gui.py:2854 virtualbricks/gui/gui.py:2777 #: virtualbricks/gui/gui.py:2797 virtualbricks/gui/gui.py:2827 #: virtualbricks/gui/gui.py:2817 virtualbricks/gui/gui.py:2847 #: virtualbricks/gui/gui.py:2805 virtualbricks/gui/gui.py:2825 #: virtualbricks/gui/gui.py:2855 virtualbricks/gui/gui.py:2812 #: virtualbricks/gui/gui.py:2832 virtualbricks/gui/gui.py:2862 #: virtualbricks/gui/gui.py:2814 virtualbricks/gui/gui.py:2834 #: virtualbricks/gui/gui.py:2864 virtualbricks/gui/gui.py:2816 #: virtualbricks/gui/gui.py:2836 virtualbricks/gui/gui.py:2866 #: virtualbricks/gui/gui.py:2790 virtualbricks/gui/gui.py:2810 #: virtualbricks/gui/gui.py:2840 msgid "All files" msgstr "" #: virtualbricks/gui/gui.py:2816 virtualbricks/gui/gui.py:2789 #: virtualbricks/gui/gui.py:2809 virtualbricks/gui/gui.py:2817 #: virtualbricks/gui/gui.py:2824 virtualbricks/gui/gui.py:2826 #: virtualbricks/gui/gui.py:2828 virtualbricks/gui/gui.py:2802 msgid "Save as..." msgstr "" #: virtualbricks/gui/gui.py:2846 virtualbricks/gui/gui.py:2819 #: virtualbricks/gui/gui.py:2839 virtualbricks/gui/gui.py:2847 #: virtualbricks/gui/gui.py:2854 virtualbricks/gui/gui.py:2856 #: virtualbricks/gui/gui.py:2858 virtualbricks/gui/gui.py:2832 msgid "New project" msgstr "" #: virtualbricks/settings.py:86 #, python-format msgid "Configuration loaded ('%s')" msgstr "" #: virtualbricks/settings.py:88 msgid "Cannot read config file " msgstr "" #: virtualbricks/settings.py:90 msgid "Default configuration loaded" msgstr "" #: virtualbricks/settings.py:94 #, python-format msgid "Default configuration saved ('%s')" msgstr "" #: virtualbricks/settings.py:97 msgid "Cannot save default configuration" msgstr "" #: virtualbricks/gui/gui.py:1316 #, python-format msgid "" "\t\tCHANNEL BANDWIDTH\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1326 virtualbricks/gui/gui.py:1319 #, python-format msgid "" "\t\tINTERFACE SPEED\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1336 virtualbricks/gui/gui.py:1322 #, python-format msgid "" "\t\tDELAY\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1325 #, python-format msgid "" "\t\tCHANNEL BUFFER SIZE\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1316 #, python-format msgid "" "\t\tCHANNEL BANDWIDTH\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10\\% for a base value " "of 100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98\\% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1319 #, python-format msgid "" "\t\tINTERFACE SPEED\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10\\% for a base value " "of 100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98\\% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1329 #, python-format msgid "" "\t\tDELAY\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10\\% for a base value " "of 100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98\\% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1316 #, python-format msgid "" "\t\tCHANNEL BANDWIDTH\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1319 virtualbricks/gui/gui.py:1320 #: virtualbricks/gui/gui.py:1327 #, python-format msgid "" "\t\tINTERFACE SPEED\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1329 virtualbricks/gui/gui.py:1331 #: virtualbricks/gui/gui.py:1338 #, python-format msgid "" "\t\tDELAY\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1342 virtualbricks/gui/gui.py:1349 #, python-format msgid "" "\t\tCHANNEL BUFFER SIZE\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1352 virtualbricks/gui/gui.py:1359 #, python-format msgid "" "\t\tPACKET LOSS\n" "Percentage of loss as a floating point number.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1361 virtualbricks/gui/gui.py:1368 #, python-format msgid "" "\t\tPACKET DUPLICATION\n" "Percentage of dup packet. Do not use dup factor 100%% because it means that " "each packet is sent infinite times.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1371 virtualbricks/gui/gui.py:1378 #, python-format msgid "" "\t\tNOISE\n" "Number of bits damaged/one megabyte (megabit).\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1380 virtualbricks/gui/gui.py:1387 #, python-format msgid "" "\t\tLOST BURST\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1390 virtualbricks/gui/gui.py:1397 msgid "" "\t\tMTU: MAXIMUM TRANSMISSION UNIT\n" "Packets longer than specified size are discarded." msgstr "" #: share/virtualbricks.template.glade:1833 msgid "Number of CPUs:" msgstr "" #: virtualbricks/brickfactory.py:641 msgid "can not stop brick error code:" msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1329 #, python-format msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1340 #, python-format msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1351 #, python-format msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1361 virtualbricks/gui/gui.py:1363 #, python-format msgid "" "\t\t\tPACKET LOSS\n" "\n" "Percentage of loss as a floating point number.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1370 virtualbricks/gui/gui.py:1372 msgid "" "\t\t\tPACKET DUPLICATION\n" "\n" "Percentage of dup packet. Do not use dup factor 100% because it means that " "each packet is sent infinite times.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1380 virtualbricks/gui/gui.py:1382 #, python-format msgid "" "\t\t\tNOISE\n" "\n" "Number of bits damaged/one megabyte (megabit).\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1389 virtualbricks/gui/gui.py:1391 #, python-format msgid "" "\t\t\tLOST BURST\n" "\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1399 virtualbricks/gui/gui.py:1401 #: virtualbricks/gui/gui.py:1382 virtualbricks/gui/gui.py:1375 msgid "" "\t\t\tMTU: MAXIMUM TRANSMISSION UNIT\n" "\n" "Packets longer than specified size are discarded." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1329 virtualbricks/gui/gui.py:1331 #, python-format msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1340 virtualbricks/gui/gui.py:1342 #, python-format msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1351 virtualbricks/gui/gui.py:1353 #, python-format msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10\\% for a base value " "of 100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98\\% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10\\u0025 for a base " "value of 100 means the final value goes from 90 to 110. The distribution can " "be Uniform or Gaussian normal (more than 98\\% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1317 #, python-format msgid "" "Jitter 10% for a base value of 100 means the final value goes from 90 to " "110. The distribution can be Uniform or Gaussian normal (more than 98% of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1323 virtualbricks/gui/gui.py:1325 msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1317 #, python-format msgid "" "Jitter 10%% for a base value of 100 means the final value goes from 90 to " "110. The distribution can be Uniform or Gaussian normal (more than 98%% of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "Jitter 10 percent for a base value of 100 means the final value goes from 90 " "to 110. The distribution can be Uniform or Gaussian normal (more than 98% of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1333 msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1341 msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1349 msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1356 msgid "" "\t\t\tPACKET LOSS\n" "\n" "Percentage of loss as a floating point number.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1362 msgid "" "\t\t\tPACKET DUPLICATION\n" "\n" "Percentage of dup packet. Do not use dup factor 100% because it means that " "each packet is sent infinite times.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1369 msgid "" "\t\t\tNOISE\n" "\n" "Number of bits damaged/one megabyte (megabit).\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1375 msgid "" "\t\t\tLOST BURST\n" "\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "Jitter 10 %% percent for a base value of 100 means the final value goes from " "90 to 110. The distribution can be Uniform or Gaussian normal (more than " "98% of the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 msgid "" "Jitter 10 % percent for a base value of 100 means the final value goes from " "90 to 110. The distribution can be Uniform or Gaussian normal (more than 98% " "of the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "Jitter 10 % for a base value of 100 means the final value goes from 90 to " "110. The distribution can be Uniform or Gaussian normal (more than 98 % of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "Jitter 10 %% for a base value of 100 means the final value goes from 90 to " "110. The distribution can be Uniform or Gaussian normal (more than 98 %% of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\n" "Jitter is the variation from the base value. Jitter 10 percent for a base " "value of 100 means the final value goes from 90 to 110. The distribution can " "be Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1326 msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path)." msgstr "" #: virtualbricks/gui/gui.py:1333 msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth." msgstr "" #: virtualbricks/gui/gui.py:1340 msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay." msgstr "" #: virtualbricks/gui/gui.py:1347 msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded." msgstr "" #: virtualbricks/gui/gui.py:1353 msgid "" "\t\t\tPACKET LOSS\n" "\n" "Percentage of loss as a floating point number." msgstr "" #: virtualbricks/gui/gui.py:1358 msgid "" "\t\t\tPACKET DUPLICATION\n" "\n" "Percentage of dup packet. Do not use dup factor 100% because it means that " "each packet is sent infinite times." msgstr "" #: virtualbricks/gui/gui.py:1364 msgid "" "\t\t\tNOISE\n" "\n" "Number of bits damaged/one megabyte (megabit)." msgstr "" #: virtualbricks/gui/gui.py:1369 msgid "" "\t\t\tLOST BURST\n" "\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts." msgstr "" virtualbricks-1.0.2/locale/virtualbricks/es.po000066400000000000000000001542501262207653100215030ustar00rootroot00000000000000# Spanish translation for virtualbrick # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the virtualbrick package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: virtualbrick\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2011-05-24 14:31+0200\n" "PO-Revision-Date: 2011-05-28 15:34+0000\n" "Last-Translator: marcos.gm \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2011-06-01 20:16+0000\n" "X-Generator: Launchpad (build 13144)\n" #: share/virtualbricks.template.glade:10 msgid "Virtualbricks" msgstr "Virtualbricks" #: share/virtualbricks.template.glade:27 msgid "_File" msgstr "_Fichero" #: share/virtualbricks.template.glade:33 msgid "_Open Project" msgstr "_Abrir proyecto" #: share/virtualbricks.template.glade:48 msgid "_Recent Projects..." msgstr "Proyectos _Recientes" #: share/virtualbricks.template.glade:68 msgid "Restart with _empty project" msgstr "Recomenzar con proyecto vacio" #: share/virtualbricks.template.glade:83 msgid "_Import bricks" msgstr "Importar bricks" #: share/virtualbricks.template.glade:98 msgid "_Save project as..." msgstr "Guardar proyecto como" #: share/virtualbricks.template.glade:132 msgid "_Settings" msgstr "_Preferencias" #: share/virtualbricks.template.glade:140 msgid "configure Virtualbricks" msgstr "Configurar Virtualbricks" #: share/virtualbricks.template.glade:150 msgid "auto show empty settings" msgstr "Mostrar configuraciones vacías" #: share/virtualbricks.template.glade:159 msgid "auto hide stored settings" msgstr "Ocultar configuraciones guardadas" #: share/virtualbricks.template.glade:171 msgid "_View" msgstr "_Ver" #: share/virtualbricks.template.glade:179 msgid "_Messages" msgstr "_Mensajes" #: share/virtualbricks.template.glade:191 msgid "_Image creation" msgstr "Creación de imagen" #: share/virtualbricks.template.glade:198 msgid "Not implemented yet" msgstr "Aun no implementado" #: share/virtualbricks.template.glade:199 msgid "_Create new image" msgstr "_Crear nueva imagen" #: share/virtualbricks.template.glade:211 msgid "_Help" msgstr "_Ayuda" #: share/virtualbricks.template.glade:218 msgid "About Virtualbricks and QEMU" msgstr "Acerca de Virtualbricks y QEMU" #: share/virtualbricks.template.glade:219 msgid "_About" msgstr "_Acerca de" #: share/virtualbricks.template.glade:271 msgid "Bricks:" msgstr " Bricks: " #: share/virtualbricks.template.glade:298 msgid "New Brick" msgstr "Nuevo Brick" #: share/virtualbricks.template.glade:320 msgid "Start All Bricks" msgstr "Arrancar todos los bricks" #: share/virtualbricks.template.glade:334 msgid "Stop All Bricks" msgstr "Parar todos los bricks" #: share/virtualbricks.template.glade:361 msgid "" "You can use drag and drop to connect bricks and double click to start/stop " "them." msgstr "" "Puedes usar \"drag & drop\" para conectar bricks, y doble click para " "arrancar o pararlos" #: share/virtualbricks.template.glade:378 virtualbricks/gui/gui.py:115 msgid "Bricks" msgstr "Bricks (Bloques)" #: share/virtualbricks.template.glade:396 msgid "New Event" msgstr "Nuevo Evento" #: share/virtualbricks.template.glade:418 msgid "Start All Events" msgstr "Arrancar todos los eventos" #: share/virtualbricks.template.glade:432 msgid "Stop All Events" msgstr "Parar todos los eventos" #: share/virtualbricks.template.glade:459 msgid "" "You can use drag and drop to add an event to events collation and double " "click to start/stop them." msgstr "" "Puedes usar \"drag & drop\" para añadir un evento a una colación, y doble " "click para arrancar o pararlos" #: share/virtualbricks.template.glade:477 msgid "Events" msgstr "Eventos" #: share/virtualbricks.template.glade:494 msgid "" "Click to select an enty for use or edit its configuration, rightclick for " "more." msgstr "" "Click para seleccionar o editar la configuración, click derecho para más" #: share/virtualbricks.template.glade:508 msgid "Running" msgstr "En ejecución" #: share/virtualbricks.template.glade:526 msgid "Add host:" msgstr "Añadir host" #: share/virtualbricks.template.glade:601 msgid "Remote Sessions" msgstr "Sesiones Remotas" #: share/virtualbricks.template.glade:637 msgid "Export as Image" msgstr "Exportar como imagen" #: share/virtualbricks.template.glade:653 msgid "Expand Horizontally" msgstr "Expandir horizontalmente" #: share/virtualbricks.template.glade:668 msgid "Expand Vertically" msgstr "Expandir verticalmente" #: share/virtualbricks.template.glade:725 msgid "Topology" msgstr "Topología" #: share/virtualbricks.template.glade:744 msgid "Show/hide configuration panel for selected boot image" msgstr "" "Mostar/Ocultar panel de configuración para la imagen de arranque seleccionada" #: share/virtualbricks.template.glade:769 msgid "Show settings" msgstr "Mostrar preferencias" #: share/virtualbricks.template.glade:839 msgid "boot as device" msgstr "Arrancar como dispositivo" #: share/virtualbricks.template.glade:871 msgid "Snapshot mode" msgstr "Modo snapshot" #: share/virtualbricks.template.glade:876 msgid "write to temporary files instead of disk image files" msgstr "Escribir en ficheros temporales en vez de ficheros imagen de disco" #: share/virtualbricks.template.glade:902 msgid "boot options" msgstr " Opciones de arranque " #: share/virtualbricks.template.glade:931 msgid "use image as cdrom" msgstr "Usar imagen como CD-ROM" #: share/virtualbricks.template.glade:936 msgid "use one of the image files in the default folder as cdrom device" msgstr "" "Usar una de los ficheros imagen en la carpeta predefinida como dispositivo " "de CD-ROM" #: share/virtualbricks.template.glade:951 msgid "mount cdrom" msgstr "Montar CD-ROM" #: share/virtualbricks.template.glade:956 msgid "mount local cdrom Drive" msgstr "Montar dispositivo local de CD-ROM" #: share/virtualbricks.template.glade:970 msgid "no cdrom" msgstr "Sin CD-ROM" #: share/virtualbricks.template.glade:975 msgid "don´t use any cdrom device" msgstr "No uso ningun dipositivo de CD-ROm" #: share/virtualbricks.template.glade:990 msgid "/dev/cdrom\n" msgstr "/dev/cdrom\n" #: share/virtualbricks.template.glade:1062 msgid "cdrom device" msgstr " dispositivo de CD-ROM " #: share/virtualbricks.template.glade:1110 msgid "Select images for Qemu volumes" msgstr "Seleccionar imágenes para volúmenes QEMU" #: share/virtualbricks.template.glade:1134 #: share/virtualbricks.template.glade:12354 msgid "fdb" msgstr "fdb" #: share/virtualbricks.template.glade:1148 #: share/virtualbricks.template.glade:12339 msgid "fda" msgstr "fda" #: share/virtualbricks.template.glade:1162 msgid "hdd" msgstr "hdd" #: share/virtualbricks.template.glade:1176 msgid "hdc" msgstr "hdc" #: share/virtualbricks.template.glade:1190 msgid "hdb" msgstr "hdb" #: share/virtualbricks.template.glade:1204 msgid "hda" msgstr "hda" #: share/virtualbricks.template.glade:1315 msgid "mtdblock" msgstr "mtdblock" #: share/virtualbricks.template.glade:1360 #: share/virtualbricks.template.glade:1401 #: share/virtualbricks.template.glade:1444 #: share/virtualbricks.template.glade:1487 #: share/virtualbricks.template.glade:1530 #: share/virtualbricks.template.glade:1573 #: share/virtualbricks.template.glade:1616 msgid "Private COW" msgstr "Private COW" #: share/virtualbricks.template.glade:1648 msgid "additional media" msgstr " Medios Adicionales " #: share/virtualbricks.template.glade:1685 #: share/virtualbricks.template.glade:12420 msgid "Drives" msgstr "Unidades" #: share/virtualbricks.template.glade:1723 msgid "Architecture: " msgstr "Arquitectura: " #: share/virtualbricks.template.glade:1752 #: share/virtualbricks.template.glade:1802 msgid "\n" msgstr "\n" #: share/virtualbricks.template.glade:1764 msgid "CPU Type" msgstr "Tipo de CPU" #: share/virtualbricks.template.glade:1776 msgid "" "\n" "\n" msgstr "" "\n" "\n" #: share/virtualbricks.template.glade:1790 msgid "Machine type" msgstr "Tipo de máquina" #: share/virtualbricks.template.glade:1816 msgid "KVM" msgstr "KVM" #: share/virtualbricks.template.glade:1833 msgid "Number of CPUs:" msgstr "Número de CPUs:" #: share/virtualbricks.template.glade:1870 msgid "System and machine" msgstr " Sistema y máquina " #: share/virtualbricks.template.glade:1928 msgid "disable graphical output" msgstr "Desactivar Salida Gráfica" #: share/virtualbricks.template.glade:1933 msgid "disable graphical output and redirect serial I/Os to console" msgstr "Desactivar Salida Gráfica y redirigir Serial I/Os a consola" #: share/virtualbricks.template.glade:1960 msgid "Use VGA instead of Default" msgstr "Usar VGA en vez del Por Defecto" #: share/virtualbricks.template.glade:1965 msgid "" "simulate a standard VGA card with VESA Bochs Extensions (default is CL-" "GD5446 PCI VGA)" msgstr "" "Simular una tarjeta VGA Estandar con VESA Bochs Extensions (por defecto CL-" "GD5446 PCI VGA)" #: share/virtualbricks.template.glade:1980 msgid "Start in vncserver" msgstr "Arrancar en vncserver" #: share/virtualbricks.template.glade:1985 msgid "start emulation in a VNC server on display" msgstr "Arrancar emulación en un servidor VNC en el display" #: share/virtualbricks.template.glade:1999 msgid "on Display: " msgstr "En Display: " #: share/virtualbricks.template.glade:2011 msgid "select Dsiplay for VNC server" msgstr "Selecciona Display para VNC Server" #: share/virtualbricks.template.glade:2029 msgid "SDL" msgstr "SDL" #: share/virtualbricks.template.glade:2041 msgid "Portrait" msgstr "Vertical" #: share/virtualbricks.template.glade:2063 msgid "Display Options" msgstr " Opciones de Display " #: share/virtualbricks.template.glade:2092 msgid "enable usb" msgstr "Activar USB" #: share/virtualbricks.template.glade:2097 msgid "enable access to usb" msgstr "Activar acceso a USB" #: share/virtualbricks.template.glade:2128 msgid "USB settings" msgstr " Opciones de USB " #: share/virtualbricks.template.glade:2165 msgid "Set realtime clock to local time" msgstr "Establecer reloj de tiempo real a la hora local" #: share/virtualbricks.template.glade:2170 msgid "set the real time clock to local time [default=utc]" msgstr "Establecer reloj de tiempo real a la hora local [defecto=UTC]" #: share/virtualbricks.template.glade:2182 msgid "Guest time drift compensation (TDF)" msgstr "Compensación de decalaje de tiempo en el Guest" #: share/virtualbricks.template.glade:2200 msgid "Keyboard: " msgstr "Teclado: " #: share/virtualbricks.template.glade:2230 msgid "Serial" msgstr "Serie" #: share/virtualbricks.template.glade:2247 msgid "Extra Settings" msgstr " Ajustes Extra " #: share/virtualbricks.template.glade:2293 msgid "select emulated Soundcard " msgstr "Seleccionar Tarjeta de Sonido emulada " #: share/virtualbricks.template.glade:2321 #: share/virtualbricks.template.glade:2663 #: share/virtualbricks.template.glade:3500 #: share/virtualbricks.template.glade:3521 #: share/virtualbricks.template.glade:10153 #: share/virtualbricks.template.glade:10174 #: share/virtualbricks.template.glade:10326 #: share/virtualbricks.template.glade:10545 msgid " \n" msgstr " \n" #: share/virtualbricks.template.glade:2337 msgid "Audio Device Settings" msgstr " Ajustes de dispositivo de Audio " #: share/virtualbricks.template.glade:2366 msgid "Used RAM:" msgstr "RAM usada:" #: share/virtualbricks.template.glade:2392 #: share/virtualbricks.template.glade:2439 msgid " MB" msgstr " MB" #: share/virtualbricks.template.glade:2410 msgid "KVM Shadow Memory: " msgstr "KVM Memoria Shadow: " #: share/virtualbricks.template.glade:2457 msgid "Memory Settings" msgstr " Ajustes de Memoria " #: share/virtualbricks.template.glade:2518 msgid "System" msgstr "Sistema" #: share/virtualbricks.template.glade:2544 msgid "Disable networking" msgstr "Deshabilitar Redes" #: share/virtualbricks.template.glade:2571 msgid "No Network" msgstr " Sin Red " #: share/virtualbricks.template.glade:2598 msgid "Start with usermode network (default)" msgstr "Arrancar con red en modo usuario (por defecto)" #: share/virtualbricks.template.glade:2624 msgid "Connect to network" msgstr " Conectar a red " #: share/virtualbricks.template.glade:2650 #: share/virtualbricks.template.glade:9938 msgid "Connect to:" msgstr "Conectar con:" #: share/virtualbricks.template.glade:2674 msgid "Virtual ethernet model:" msgstr "Modelo de ethernet virtual:" #: share/virtualbricks.template.glade:2685 msgid "" "\n" "rtl8139\n" "e1000\n" "virtio\n" "i82551\n" "i82557b\n" "i82559er\n" "ne2k_pci\n" "pcnet\n" "ne2k_isa\n" msgstr "" "\n" "Copy text \t\n" "\n" "rtl8139\n" "e1000\n" "virtio\n" "i82551\n" "i82557b\n" "i82559er\n" "ne2k_pci\n" "pcnet\n" "ne2k_isa\n" #: share/virtualbricks.template.glade:2705 msgid "Mac address:" msgstr "Direccion MAC:" #: share/virtualbricks.template.glade:2726 msgid "Randomize" msgstr "Aleatorizar" #: share/virtualbricks.template.glade:2756 msgid "Set up a new network card" msgstr "Configurar una nueva tarjeta de red" #: share/virtualbricks.template.glade:2783 msgid "Add Network card" msgstr "Añadir tarjeta de red" #: share/virtualbricks.template.glade:2809 msgid "Edit selected network card or redirection" msgstr "Editar la tarjeta de red seleccionada o redirección" #: share/virtualbricks.template.glade:2836 msgid "Edit" msgstr "Editar" #: share/virtualbricks.template.glade:2862 msgid "Remove selected network card or redirection" msgstr "Quitar la tarjeta de red seleccionada o redirección" #: share/virtualbricks.template.glade:2890 #: share/virtualbricks.template.glade:11339 msgid "Remove" msgstr "Quitar" #: share/virtualbricks.template.glade:2950 msgid "SMB share" msgstr " Compartición SMB " #: share/virtualbricks.template.glade:2975 msgid "SMB Share" msgstr "Compartición SMB" #: share/virtualbricks.template.glade:3031 msgid "Network cards" msgstr " Tarjetas de red " #: share/virtualbricks.template.glade:3064 msgid "Network" msgstr "Red" #: share/virtualbricks.template.glade:3092 msgid "Use a custom kernel" msgstr "Usar kernel personalizado" #: share/virtualbricks.template.glade:3105 msgid "Specify initial ramdisk" msgstr "Especificar ramdisk inicial" #: share/virtualbricks.template.glade:3136 msgid "Parameters to append to command line:" msgstr "Parametros a añadir a la linea de comandos" #: share/virtualbricks.template.glade:3248 msgid "Enable kernel debugging" msgstr "Activar debugging del kernel" #: share/virtualbricks.template.glade:3263 msgid "GNU debugger TCP port:" msgstr "Puerto TCP del debugger GNU" #: share/virtualbricks.template.glade:3296 msgid "Booting Linux" msgstr " Arrancando Linux " #: share/virtualbricks.template.glade:3323 msgid "Customize Linux Boot" msgstr "Personalizar Arranque de Linux" #: share/virtualbricks.template.glade:3416 msgid "Virtual Machine Icon" msgstr " Icono de Maquina Virtual " #: share/virtualbricks.template.glade:3456 msgid "Others" msgstr "Otros" #: share/virtualbricks.template.glade:3510 #: share/virtualbricks.template.glade:10163 msgid "<=== connect ===>" msgstr "<=== conectar ===>" #: share/virtualbricks.template.glade:3539 msgid "Plugs" msgstr "Conectores" #: share/virtualbricks.template.glade:3569 #: share/virtualbricks.template.glade:4293 #: share/virtualbricks.template.glade:5061 #: share/virtualbricks.template.glade:5782 #: share/virtualbricks.template.glade:6525 #: share/virtualbricks.template.glade:7246 #: share/virtualbricks.template.glade:7987 #: share/virtualbricks.template.glade:8712 #: share/virtualbricks.template.glade:9444 msgid "Symmetrical" msgstr "Simétrico" #: share/virtualbricks.template.glade:3587 #: share/virtualbricks.template.glade:5079 #: share/virtualbricks.template.glade:5800 #: share/virtualbricks.template.glade:6543 #: share/virtualbricks.template.glade:7264 #: share/virtualbricks.template.glade:8005 #: share/virtualbricks.template.glade:8730 #: share/virtualbricks.template.glade:9462 msgid "Multiplier" msgstr "Multiplicador" #: share/virtualbricks.template.glade:3616 #: share/virtualbricks.template.glade:4340 #: share/virtualbricks.template.glade:5106 #: share/virtualbricks.template.glade:5829 #: share/virtualbricks.template.glade:6570 #: share/virtualbricks.template.glade:7291 #: share/virtualbricks.template.glade:8035 #: share/virtualbricks.template.glade:8757 #: share/virtualbricks.template.glade:9491 msgid "UM" msgstr "UM" #: share/virtualbricks.template.glade:3642 #: share/virtualbricks.template.glade:4366 #: share/virtualbricks.template.glade:5131 #: share/virtualbricks.template.glade:5854 #: share/virtualbricks.template.glade:6595 #: share/virtualbricks.template.glade:7316 #: share/virtualbricks.template.glade:8061 #: share/virtualbricks.template.glade:8782 #: share/virtualbricks.template.glade:9517 msgid "General parameters" msgstr "Parámetros generales" #: share/virtualbricks.template.glade:3669 #: share/virtualbricks.template.glade:3856 #: share/virtualbricks.template.glade:4052 #: share/virtualbricks.template.glade:4393 #: share/virtualbricks.template.glade:4580 #: share/virtualbricks.template.glade:4776 #: share/virtualbricks.template.glade:5158 #: share/virtualbricks.template.glade:5345 #: share/virtualbricks.template.glade:5541 #: share/virtualbricks.template.glade:5881 #: share/virtualbricks.template.glade:6068 #: share/virtualbricks.template.glade:6264 #: share/virtualbricks.template.glade:6622 #: share/virtualbricks.template.glade:6809 #: share/virtualbricks.template.glade:7005 #: share/virtualbricks.template.glade:7343 #: share/virtualbricks.template.glade:7530 #: share/virtualbricks.template.glade:7726 #: share/virtualbricks.template.glade:8088 #: share/virtualbricks.template.glade:8275 #: share/virtualbricks.template.glade:8471 #: share/virtualbricks.template.glade:8809 #: share/virtualbricks.template.glade:8996 #: share/virtualbricks.template.glade:9192 #: share/virtualbricks.template.glade:9544 #: share/virtualbricks.template.glade:9614 #: share/virtualbricks.template.glade:9693 msgid "Base" msgstr "Base" #: share/virtualbricks.template.glade:3708 #: share/virtualbricks.template.glade:3895 #: share/virtualbricks.template.glade:4091 #: share/virtualbricks.template.glade:4432 #: share/virtualbricks.template.glade:4619 #: share/virtualbricks.template.glade:4815 #: share/virtualbricks.template.glade:5197 #: share/virtualbricks.template.glade:5384 #: share/virtualbricks.template.glade:5580 #: share/virtualbricks.template.glade:5920 #: share/virtualbricks.template.glade:6107 #: share/virtualbricks.template.glade:6303 #: share/virtualbricks.template.glade:6661 #: share/virtualbricks.template.glade:6848 #: share/virtualbricks.template.glade:7044 #: share/virtualbricks.template.glade:7382 #: share/virtualbricks.template.glade:7569 #: share/virtualbricks.template.glade:7765 #: share/virtualbricks.template.glade:8127 #: share/virtualbricks.template.glade:8314 #: share/virtualbricks.template.glade:8510 #: share/virtualbricks.template.glade:8848 #: share/virtualbricks.template.glade:9035 #: share/virtualbricks.template.glade:9231 msgid "±" msgstr "Copy text \t ±" #: share/virtualbricks.template.glade:3729 #: share/virtualbricks.template.glade:3916 #: share/virtualbricks.template.glade:4112 #: share/virtualbricks.template.glade:4453 #: share/virtualbricks.template.glade:4640 #: share/virtualbricks.template.glade:4836 #: share/virtualbricks.template.glade:5218 #: share/virtualbricks.template.glade:5405 #: share/virtualbricks.template.glade:5601 #: share/virtualbricks.template.glade:5941 #: share/virtualbricks.template.glade:6128 #: share/virtualbricks.template.glade:6324 #: share/virtualbricks.template.glade:6682 #: share/virtualbricks.template.glade:6869 #: share/virtualbricks.template.glade:7065 #: share/virtualbricks.template.glade:7403 #: share/virtualbricks.template.glade:7590 #: share/virtualbricks.template.glade:7786 #: share/virtualbricks.template.glade:8148 #: share/virtualbricks.template.glade:8335 #: share/virtualbricks.template.glade:8531 #: share/virtualbricks.template.glade:8869 #: share/virtualbricks.template.glade:9056 #: share/virtualbricks.template.glade:9252 msgid "Jitter" msgstr "Jitter" #: share/virtualbricks.template.glade:3768 #: share/virtualbricks.template.glade:3955 #: share/virtualbricks.template.glade:4151 #: share/virtualbricks.template.glade:4492 #: share/virtualbricks.template.glade:4679 #: share/virtualbricks.template.glade:4875 #: share/virtualbricks.template.glade:5257 #: share/virtualbricks.template.glade:5444 #: share/virtualbricks.template.glade:5640 #: share/virtualbricks.template.glade:5980 #: share/virtualbricks.template.glade:6167 #: share/virtualbricks.template.glade:6363 #: share/virtualbricks.template.glade:6721 #: share/virtualbricks.template.glade:6908 #: share/virtualbricks.template.glade:7104 #: share/virtualbricks.template.glade:7442 #: share/virtualbricks.template.glade:7629 #: share/virtualbricks.template.glade:7825 #: share/virtualbricks.template.glade:8187 #: share/virtualbricks.template.glade:8374 #: share/virtualbricks.template.glade:8570 #: share/virtualbricks.template.glade:8908 #: share/virtualbricks.template.glade:9095 #: share/virtualbricks.template.glade:9291 msgid "%" msgstr "%" #: share/virtualbricks.template.glade:3788 #: share/virtualbricks.template.glade:3975 #: share/virtualbricks.template.glade:4171 #: share/virtualbricks.template.glade:4895 #: share/virtualbricks.template.glade:5277 #: share/virtualbricks.template.glade:5464 #: share/virtualbricks.template.glade:5660 #: share/virtualbricks.template.glade:6000 #: share/virtualbricks.template.glade:6187 #: share/virtualbricks.template.glade:6383 #: share/virtualbricks.template.glade:6741 #: share/virtualbricks.template.glade:6928 #: share/virtualbricks.template.glade:7124 #: share/virtualbricks.template.glade:7462 #: share/virtualbricks.template.glade:7649 #: share/virtualbricks.template.glade:7845 #: share/virtualbricks.template.glade:8207 #: share/virtualbricks.template.glade:8394 #: share/virtualbricks.template.glade:8590 #: share/virtualbricks.template.glade:8928 #: share/virtualbricks.template.glade:9115 #: share/virtualbricks.template.glade:9311 msgid "Distrib." msgstr "Distrib." #: share/virtualbricks.template.glade:3817 #: share/virtualbricks.template.glade:4541 #: share/virtualbricks.template.glade:5306 #: share/virtualbricks.template.glade:6029 #: share/virtualbricks.template.glade:6770 #: share/virtualbricks.template.glade:7491 #: share/virtualbricks.template.glade:8236 #: share/virtualbricks.template.glade:8957 #: share/virtualbricks.template.glade:9575 msgid "Left to Right" msgstr "De izquierda a derecha" #: share/virtualbricks.template.glade:4012 #: share/virtualbricks.template.glade:4736 #: share/virtualbricks.template.glade:5501 #: share/virtualbricks.template.glade:6224 #: share/virtualbricks.template.glade:6965 #: share/virtualbricks.template.glade:7686 #: share/virtualbricks.template.glade:8431 #: share/virtualbricks.template.glade:9152 #: share/virtualbricks.template.glade:9653 msgid "Both Directions" msgstr "Ambas direcciones" #: share/virtualbricks.template.glade:4209 #: share/virtualbricks.template.glade:4933 #: share/virtualbricks.template.glade:5698 #: share/virtualbricks.template.glade:6421 #: share/virtualbricks.template.glade:7162 #: share/virtualbricks.template.glade:7883 #: share/virtualbricks.template.glade:8628 #: share/virtualbricks.template.glade:9349 #: share/virtualbricks.template.glade:9733 msgid "Right to Left" msgstr "De derecha a izquierda" #: share/virtualbricks.template.glade:4235 msgid "Bandwidth Restriction" msgstr "" #: share/virtualbricks.template.glade:4521 msgid "" "Uniform\n" "Gaussian" msgstr "" #: share/virtualbricks.template.glade:4959 msgid "Interface Speed" msgstr "" #: share/virtualbricks.template.glade:4978 msgid "Enable(advanced)" msgstr "" #: share/virtualbricks.template.glade:5030 msgid "Bandwidth" msgstr "" #: share/virtualbricks.template.glade:5724 msgid "Packet Delay" msgstr "" #: share/virtualbricks.template.glade:6447 msgid "Channel Buffer Size" msgstr "" #: share/virtualbricks.template.glade:6495 virtualbricks/brickfactory.py:885 msgid "Delay" msgstr "" #: share/virtualbricks.template.glade:7188 msgid "Packet Loss" msgstr "" #: share/virtualbricks.template.glade:7909 msgid "Packet Duplication" msgstr "" #: share/virtualbricks.template.glade:7957 msgid "Disruptions 1/3" msgstr "" #: share/virtualbricks.template.glade:8654 msgid "Noise" msgstr "" #: share/virtualbricks.template.glade:9375 msgid "Lost Burst" msgstr "" #: share/virtualbricks.template.glade:9413 msgid "Disruptions 2/3" msgstr "" #: share/virtualbricks.template.glade:9759 msgid "Maximum Transmission Unit (MTU)" msgstr "" #: share/virtualbricks.template.glade:9801 msgid "Disruptions 3/3" msgstr "" #: share/virtualbricks.template.glade:9837 msgid "Number of ports: " msgstr "" #: share/virtualbricks.template.glade:9863 msgid "Use FSTP" msgstr "" #: share/virtualbricks.template.glade:9875 msgid "Hub mode" msgstr "" #: share/virtualbricks.template.glade:9897 msgid "Switch Configuration" msgstr "" #: share/virtualbricks.template.glade:9947 msgid "" " \n" "\n" msgstr "" #: share/virtualbricks.template.glade:9978 msgid "Don't touch interface settings" msgstr "" #: share/virtualbricks.template.glade:9988 msgid "Use DHCP" msgstr "" #: share/virtualbricks.template.glade:10003 msgid "Manual settings" msgstr "" #: share/virtualbricks.template.glade:10033 msgid "IP Address: " msgstr "" #: share/virtualbricks.template.glade:10040 msgid "Netmask: " msgstr "" #: share/virtualbricks.template.glade:10051 msgid "Gateway: " msgstr "" #: share/virtualbricks.template.glade:10065 msgid "10.0.0.1" msgstr "" #: share/virtualbricks.template.glade:10080 msgid "255.0.0.0" msgstr "" #: share/virtualbricks.template.glade:10121 msgid "Tap Configuration" msgstr "" #: share/virtualbricks.template.glade:10214 #: share/virtualbricks.template.glade:14239 msgid "Delay:" msgstr "" #: share/virtualbricks.template.glade:10246 virtualbricks/brickfactory.py:888 msgid "Actions" msgstr "" #: share/virtualbricks.template.glade:10285 msgid "Event Configuration" msgstr "" #: share/virtualbricks.template.glade:10320 #: share/virtualbricks.template.glade:10435 msgid "Connect to" msgstr "" #: share/virtualbricks.template.glade:10352 msgid "Listen to port:" msgstr "" #: share/virtualbricks.template.glade:10362 msgid "Expect password:" msgstr "" #: share/virtualbricks.template.glade:10401 msgid "Tunnel server Configuration" msgstr "" #: share/virtualbricks.template.glade:10455 #: share/virtualbricks.template.glade:12795 msgid "port:" msgstr "" #: share/virtualbricks.template.glade:10485 #: share/virtualbricks.template.glade:13817 msgid "Tunnel Server" msgstr "" #: share/virtualbricks.template.glade:10510 msgid "Password:" msgstr "" #: share/virtualbricks.template.glade:10521 msgid "Local port:" msgstr "" #: share/virtualbricks.template.glade:10564 msgid "Tunnel client Configuration" msgstr "" #: share/virtualbricks.template.glade:10603 msgid "WAIT..." msgstr "" #: share/virtualbricks.template.glade:10708 msgid "Virtualbricks Settings" msgstr "" #: share/virtualbricks.template.glade:10721 msgid "System Settings" msgstr "" #: share/virtualbricks.template.glade:10756 msgid "Bricks directory" msgstr "" #: share/virtualbricks.template.glade:10764 #: share/virtualbricks.template.glade:10900 #: share/virtualbricks.template.glade:11049 #: share/virtualbricks.template.glade:11133 msgid "Select A Folder" msgstr "" #: share/virtualbricks.template.glade:10775 msgid "X-window terminal command" msgstr "" #: share/virtualbricks.template.glade:10786 msgid "X-window sudo command" msgstr "" #: share/virtualbricks.template.glade:10797 msgid "your favorite x-terminal-emulator" msgstr "" #: share/virtualbricks.template.glade:10811 msgid "command to perform administrative actions on your system" msgstr "" #: share/virtualbricks.template.glade:10835 msgid "Enable SysTray" msgstr "" #: share/virtualbricks.template.glade:10856 msgid "General" msgstr "" #: share/virtualbricks.template.glade:10892 msgid "VDE binaries path" msgstr "" #: share/virtualbricks.template.glade:10898 msgid "Path for vde components installed on the system" msgstr "" #: share/virtualbricks.template.glade:10913 #: share/virtualbricks.template.glade:11062 msgid "Status:" msgstr "" #: share/virtualbricks.template.glade:10929 msgid "" "Error:\n" "invalid path for vde binaries" msgstr "" #: share/virtualbricks.template.glade:10956 msgid "Use python support" msgstr "" #: share/virtualbricks.template.glade:10960 msgid "Use native python support from libvdeplug" msgstr "" #: share/virtualbricks.template.glade:10969 msgid "Allow female plugs on devices" msgstr "" #: share/virtualbricks.template.glade:10973 msgid "Allow use of female plugs with all brick types" msgstr "" #: share/virtualbricks.template.glade:10982 msgid "Network topology loop detection" msgstr "" #: share/virtualbricks.template.glade:10986 msgid "" "If enabled, detect network loops when starting the bricks, and generate an " "error." msgstr "" #: share/virtualbricks.template.glade:11000 msgid "Vde" msgstr "" #: share/virtualbricks.template.glade:11041 msgid "Qemu/KVM binaries path" msgstr "" #: share/virtualbricks.template.glade:11047 msgid "Path for qemu and kvm binaries" msgstr "" #: share/virtualbricks.template.glade:11078 msgid "" "Error:\n" "invalid path for qemu/kvm binaries" msgstr "" #: share/virtualbricks.template.glade:11125 msgid "Disk images repository" msgstr "" #: share/virtualbricks.template.glade:11131 msgid "Directory that contains hard disk images" msgstr "" #: share/virtualbricks.template.glade:11149 msgid "Disk Images" msgstr "" #: share/virtualbricks.template.glade:11177 msgid "Use KVM" msgstr "" #: share/virtualbricks.template.glade:11181 msgid "Allow the use of kernel-based virtual machine (recommended)" msgstr "" #: share/virtualbricks.template.glade:11191 msgid "Enable KSM" msgstr "" #: share/virtualbricks.template.glade:11195 msgid "" "Allow using the Kernel SamePage Merging support to enhance scalability" msgstr "" #: share/virtualbricks.template.glade:11210 msgid "Use kqemu" msgstr "" #: share/virtualbricks.template.glade:11214 msgid "Use old kqemu support" msgstr "" #: share/virtualbricks.template.glade:11228 msgid "X86 optimizations" msgstr "" #: share/virtualbricks.template.glade:11245 msgid "CD-Rom/DVD/Floppy Devices" msgstr "" #: share/virtualbricks.template.glade:11265 msgid "" "Add your \"real\" physical drive volumes like CDR, DVD or Floppy devices " "here." msgstr "" #: share/virtualbricks.template.glade:11282 msgid "Name: " msgstr "" #: share/virtualbricks.template.glade:11303 msgid "Device Path: " msgstr "" #: share/virtualbricks.template.glade:11323 msgid "Add" msgstr "" #: share/virtualbricks.template.glade:11367 msgid "Qemu/KVM " msgstr "" #: share/virtualbricks.template.glade:11454 msgid "Add Bookmark" msgstr "" #: share/virtualbricks.template.glade:11468 msgid "Name:" msgstr "" #: share/virtualbricks.template.glade:11493 msgid "Path:" msgstr "" #: share/virtualbricks.template.glade:11522 msgid "Select A Icon" msgstr "" #: share/virtualbricks.template.glade:11532 msgid "Icon for this Machine" msgstr "" #: share/virtualbricks.template.glade:11612 #: share/virtualbricks.template.glade:12101 msgid "show qemu volume info for selected image" msgstr "" #: share/virtualbricks.template.glade:11627 msgid "remove this entry from My Machines" msgstr "" #: share/virtualbricks.template.glade:11637 msgid "About: Virtualbricks" msgstr "" #: share/virtualbricks.template.glade:11693 msgid "" "Virtualbricks is a GNU/Linux desktop gui for Qemu/KVM and Virtual " "Distributed Ethernet.\n" "\n" "Virtualbricks is licensed under the terms of the GPL (General Public " "Licence) Version 2.\n" "© 2011 Daniele Lacamera, Rainer Haage and the virtualbricks team on " "Launchpad. \n" "\n" "VDE - Virtual Distributed Ethernet - © 2003-2011 Renzo Davoli.\n" "QEMU - Copyright © 2005-2011 Fabrice Bellard.\n" "QEMU is a trademark of Fabrice Bellard.\n" "\n" "Icons for remote hosts are Copyleft David Vignoni - http://www.icon-" "king.com/ License: LGPL\n" "\n" "If you find virtualbricks useful for your business, please consider making a " "donation." msgstr "" #: share/virtualbricks.template.glade:11750 msgid "create new empty image" msgstr "" #: share/virtualbricks.template.glade:11767 msgid "create new empty Disk image\n" msgstr "" #: share/virtualbricks.template.glade:11780 msgid "Target Folder for the new image" msgstr "" #: share/virtualbricks.template.glade:11790 msgid "Select A Directory" msgstr "" #: share/virtualbricks.template.glade:11813 msgid "Name of the new image (or base image)" msgstr "" #: share/virtualbricks.template.glade:11828 msgid "Enter a filename for the new image" msgstr "" #: share/virtualbricks.template.glade:11859 msgid "Image format" msgstr "" #: share/virtualbricks.template.glade:11870 msgid "" "Auto\n" "raw\n" "qcow\n" "qcow2\n" "cow\n" "vmdk\n" "cloop" msgstr "" #: share/virtualbricks.template.glade:11897 msgid "Size" msgstr "" #: share/virtualbricks.template.glade:11912 msgid "Size of the new image" msgstr "" #: share/virtualbricks.template.glade:11926 msgid "" "KB\n" "MB\n" "GB" msgstr "" #: share/virtualbricks.template.glade:11986 msgid "Create" msgstr "" #: share/virtualbricks.template.glade:12036 msgid "message" msgstr "" #: share/virtualbricks.template.glade:12111 msgid "add this image to bookmarks" msgstr "" #: share/virtualbricks.template.glade:12121 msgid "Control monitor" msgstr "" #: share/virtualbricks.template.glade:12136 msgid "control monitor for selected qemu job" msgstr "" #: share/virtualbricks.template.glade:12152 msgid "kill emulation immediately" msgstr "" #: share/virtualbricks.template.glade:12165 msgid "reset emulation" msgstr "" #: share/virtualbricks.template.glade:12186 msgid "pause emulation" msgstr "" #: share/virtualbricks.template.glade:12199 msgid "resume emulation" msgstr "" #: share/virtualbricks.template.glade:12227 msgid "Available block devices" msgstr "" #: share/virtualbricks.template.glade:12245 msgid "" "This is a list of all blockdevices used by the emulation. Rightclick an " "entry to eject. (hd volumes normally can not be ejected)" msgstr "" #: share/virtualbricks.template.glade:12259 msgid "change soure of block devices" msgstr "" #: share/virtualbricks.template.glade:12275 #: share/virtualbricks.template.glade:12290 #: share/virtualbricks.template.glade:12307 msgid "Change" msgstr "" #: share/virtualbricks.template.glade:12279 msgid "" "change the source for qemu cdrom device to the selected image or drive" msgstr "" #: share/virtualbricks.template.glade:12294 msgid "" "change the source for qemu floppy A device to the selected image or drive" msgstr "" #: share/virtualbricks.template.glade:12311 msgid "" "change the source for qemu floppy B device to the selected image or drive" msgstr "" #: share/virtualbricks.template.glade:12326 msgid "cdrom" msgstr "" #: share/virtualbricks.template.glade:12369 #: share/virtualbricks.template.glade:12382 #: share/virtualbricks.template.glade:12398 msgid "None" msgstr "" #: share/virtualbricks.template.glade:12434 msgid "Available host usb devices" msgstr "" #: share/virtualbricks.template.glade:12452 msgid "" "All available host usb-devices. rightclick to attach a device to the virtual " "engine (you must have write access to /proc/bus/usb to attach devices)" msgstr "" #: share/virtualbricks.template.glade:12466 msgid "Attached guest usb devices" msgstr "" #: share/virtualbricks.template.glade:12484 msgid "" "All attached usb devices for this emulation. Rightclick to detach a device" msgstr "" #: share/virtualbricks.template.glade:12503 msgid "USB" msgstr "" #: share/virtualbricks.template.glade:12515 msgid "coming soon..." msgstr "" #: share/virtualbricks.template.glade:12525 msgid "Emulation" msgstr "" #: share/virtualbricks.template.glade:12577 msgid "open control monitor" msgstr "" #: share/virtualbricks.template.glade:12614 msgid "Suspend Qemu" msgstr "" #: share/virtualbricks.template.glade:12623 msgid "Send ACPI poweroff" msgstr "" #: share/virtualbricks.template.glade:12632 msgid "Send ACPI hard reset" msgstr "" #: share/virtualbricks.template.glade:12688 msgid "eject / unmount selected device" msgstr "" #: share/virtualbricks.template.glade:12696 msgid "Setup new network card" msgstr "" #: share/virtualbricks.template.glade:12709 msgid "Network Type" msgstr "" #: share/virtualbricks.template.glade:12721 msgid "" "Open a TUN/TAP interface\n" "Use an already open TUN/TAP interface\n" "Open a listening TCP socket\n" "Use an already open TCP socket\n" "Connect to listening TCP socket\n" "Create shared VLAN via UDP multicast socket\n" "Use an already open UDP multicast socket" msgstr "" #: share/virtualbricks.template.glade:12756 msgid "IP address: " msgstr "" #: share/virtualbricks.template.glade:12767 msgid "MAC address: " msgstr "" #: share/virtualbricks.template.glade:12808 msgid "VLAN:" msgstr "" #: share/virtualbricks.template.glade:12889 msgid "TUN/TAP configuration script:" msgstr "" #: share/virtualbricks.template.glade:12900 msgid "Name of network interface:" msgstr "" #: share/virtualbricks.template.glade:12984 msgid "File descriptor: " msgstr "" #: share/virtualbricks.template.glade:13063 msgid "Request" msgstr "" #: share/virtualbricks.template.glade:13091 #: share/virtualbricks.template.glade:14419 msgid "Are you sure?" msgstr "" #: share/virtualbricks.template.glade:13150 msgid "Add redirect" msgstr "" #: share/virtualbricks.template.glade:13175 msgid "TCP" msgstr "" #: share/virtualbricks.template.glade:13191 msgid "UDP" msgstr "" #: share/virtualbricks.template.glade:13214 #: share/virtualbricks.template.glade:13262 msgid "port " msgstr "" #: share/virtualbricks.template.glade:13239 msgid "to guest IP " msgstr "" #: share/virtualbricks.template.glade:13291 msgid "Add redirect(s)" msgstr "" #: share/virtualbricks.template.glade:13361 msgid "Mode:" msgstr "" #: share/virtualbricks.template.glade:13373 msgid "DHCP" msgstr "" #: share/virtualbricks.template.glade:13386 msgid "Manual" msgstr "" #: share/virtualbricks.template.glade:13424 msgid "Address:" msgstr "" #: share/virtualbricks.template.glade:13430 msgid "Netmask:" msgstr "" #: share/virtualbricks.template.glade:13474 msgid "Advanced" msgstr "" #: share/virtualbricks.template.glade:13495 #: share/virtualbricks.template.glade:13924 #: share/virtualbricks.template.glade:14279 msgid "Cancel" msgstr "" #: share/virtualbricks.template.glade:13508 #: share/virtualbricks.template.glade:13939 #: share/virtualbricks.template.glade:14294 msgid "Ok" msgstr "" #: share/virtualbricks.template.glade:13574 msgid "Switch" msgstr "" #: share/virtualbricks.template.glade:13613 msgid "Wire" msgstr "" #: share/virtualbricks.template.glade:13652 msgid "Wirefilter" msgstr "" #: share/virtualbricks.template.glade:13691 msgid "Tap" msgstr "" #: share/virtualbricks.template.glade:13739 msgid "Tunnel Client" msgstr "" #: share/virtualbricks.template.glade:13778 msgid "Virtual Machine" msgstr "" #: share/virtualbricks.template.glade:13842 msgid "Run on remote host:" msgstr "" #: share/virtualbricks.template.glade:13890 msgid "Brick name:" msgstr "" #: share/virtualbricks.template.glade:13968 msgid "Event type selection" msgstr "" #: share/virtualbricks.template.glade:14015 msgid "Brick Start" msgstr "" #: share/virtualbricks.template.glade:14053 msgid "Brick Stop" msgstr "" #: share/virtualbricks.template.glade:14092 msgid "Brick Config" msgstr "" #: share/virtualbricks.template.glade:14130 msgid "" "Free\n" "Shell Command" msgstr "" #: share/virtualbricks.template.glade:14178 msgid "Events Collation" msgstr "" #: share/virtualbricks.template.glade:14221 msgid "Event name:" msgstr "" #: share/virtualbricks.template.glade:14251 msgid "10" msgstr "" #: share/virtualbricks.template.glade:14327 #: share/virtualbricks.template.glade:14782 msgid " " msgstr "" #: share/virtualbricks.template.glade:14338 #: share/virtualbricks.template.glade:14793 msgid "_Start/Stop" msgstr "" #: share/virtualbricks.template.glade:14346 #: share/virtualbricks.template.glade:14801 msgid "_Delete" msgstr "" #: share/virtualbricks.template.glade:14354 #: share/virtualbricks.template.glade:14809 msgid "Make a C_opy" msgstr "" #: share/virtualbricks.template.glade:14362 #: share/virtualbricks.template.glade:14817 msgid "Re_name" msgstr "" #: share/virtualbricks.template.glade:14370 #: share/virtualbricks.template.glade:14825 msgid "_Configure" msgstr "" #: share/virtualbricks.template.glade:14379 msgid "_Resume VM" msgstr "" #: share/virtualbricks.template.glade:14387 msgid "_Attach Event" msgstr "" #: share/virtualbricks.template.glade:14427 msgid "Confirm Action" msgstr "" #: share/virtualbricks.template.glade:14502 #: share/virtualbricks.template.glade:14850 msgid "Choose a new name:" msgstr "" #: share/virtualbricks.template.glade:14569 msgid "Virtualbricks: action in progress" msgstr "" #: share/virtualbricks.template.glade:14584 msgid "Please wait" msgstr "" #: share/virtualbricks.template.glade:14613 msgid "Select Image file" msgstr "" #: share/virtualbricks.template.glade:14674 msgid "Toggle window" msgstr "" #: share/virtualbricks.template.glade:14687 msgid "Close VB" msgstr "" #: share/virtualbricks.template.glade:14695 msgid "Shell command actions" msgstr "" #: share/virtualbricks.template.glade:14712 msgid "" "Enter shell command:\n" "(each line is an action)" msgstr "" #: share/virtualbricks.template.glade:14833 msgid "New event name" msgstr "" #: share/virtualbricks.template.glade:14918 msgid "Bricks to add to the event" msgstr "" #: share/virtualbricks.template.glade:14954 msgid "Bricks available" msgstr "" #: share/virtualbricks.template.glade:14979 msgid "" "--->\n" "<---" msgstr "" #: share/virtualbricks.template.glade:15050 msgid "Bricks added" msgstr "" #: share/virtualbricks.template.glade:15114 msgid "Messages" msgstr "" #: share/virtualbricks.template.glade:15240 msgid "Start Event selection" msgstr "" #: share/virtualbricks.template.glade:15254 #: share/virtualbricks.template.glade:15319 msgid "Assign Nothing" msgstr "" #: share/virtualbricks.template.glade:15305 msgid "Stop Event selection" msgstr "" #: share/virtualbricks.template.glade:15391 msgid "Connect/Disconnect" msgstr "" #: share/virtualbricks.template.glade:15399 msgid "Change Password" msgstr "" #: share/virtualbricks.template.glade:15407 msgid "Auto-connect at startup" msgstr "" #: share/virtualbricks.template.glade:15415 msgid "Delete" msgstr "" #: share/virtualbricks.template.glade:15421 msgid "Authentication" msgstr "" #: share/virtualbricks.template.glade:15434 msgid "Password for remote virtualbricks session:" msgstr "" #: virtualbricks/brickfactory.py:584 #, python-format msgid "Starting: '%s'" msgstr "" #: virtualbricks/brickfactory.py:623 #, python-format msgid "Shutting down %s" msgstr "" #: virtualbricks/brickfactory.py:638 #, python-format msgid "can not send SIGTERM: '%s'" msgstr "" #: virtualbricks/brickfactory.py:641 msgid "can not stop brick error code:" msgstr "" #: virtualbricks/brickfactory.py:709 msgid "Error: cannot start a terminal emulator" msgstr "" #: virtualbricks/brickfactory.py:714 msgid "Error running command line" msgstr "" #: virtualbricks/brickfactory.py:721 msgid "does not have a console" msgstr "" #: virtualbricks/brickfactory.py:732 msgid "error opening internal console" msgstr "" #: virtualbricks/brickfactory.py:777 virtualbricks/brickfactory.py:834 msgid "running" msgstr "" #: virtualbricks/brickfactory.py:779 virtualbricks/brickfactory.py:1082 #: virtualbricks/brickfactory.py:1144 virtualbricks/brickfactory.py:1149 #: virtualbricks/brickfactory.py:1151 virtualbricks/brickfactory.py:1888 #: virtualbricks/brickfactory.py:1940 msgid "disconnected" msgstr "" #: virtualbricks/brickfactory.py:781 virtualbricks/brickfactory.py:838 msgid "off" msgstr "" #: virtualbricks/brickfactory.py:836 msgid "unconfigured" msgstr "" #: virtualbricks/brickfactory.py:861 msgid "Error: config line must contain add OR addsh." msgstr "" #: virtualbricks/brickfactory.py:869 #, python-format msgid "Added vb-shell command: '%s'" msgstr "" #: virtualbricks/brickfactory.py:876 #, python-format msgid "Added host-shell command: '%s'" msgstr "" #: virtualbricks/brickfactory.py:1019 msgid "Ports:" msgstr "" #: virtualbricks/brickfactory.py:1080 #, python-format msgid "plugged to %s " msgstr "" #: virtualbricks/brickfactory.py:1152 msgid "Configured to connect" msgstr "" #: virtualbricks/brickfactory.py:1154 msgid "Not yet configured." msgstr "" #: virtualbricks/brickfactory.py:1155 msgid "Left plug is" msgstr "" #: virtualbricks/brickfactory.py:1155 msgid "and right plug is" msgstr "" #: virtualbricks/brickfactory.py:1886 virtualbricks/brickfactory.py:1937 msgid "plugged to" msgstr "" #: virtualbricks/brickfactory.py:1887 msgid "listening to udp:" msgstr "" #: virtualbricks/brickfactory.py:1938 msgid ", connecting to udp://" msgstr "" #: virtualbricks/brickfactory.py:2209 msgid "command:" msgstr "" #: virtualbricks/brickfactory.py:2857 msgid "Engine: Bye!" msgstr "" #: virtualbricks/gui/gui.py:107 msgid "PID" msgstr "" #: virtualbricks/gui/gui.py:107 virtualbricks/gui/gui.py:109 #: virtualbricks/gui/gui.py:199 virtualbricks/gui/gui.py:221 #: virtualbricks/gui/gui.py:1140 virtualbricks/gui/gui.py:1162 #: virtualbricks/gui/gui.py:2739 virtualbricks/gui/gui.py:2761 msgid "Type" msgstr "" #: virtualbricks/gui/gui.py:107 virtualbricks/gui/gui.py:109 #: virtualbricks/gui/gui.py:204 virtualbricks/gui/gui.py:223 #: virtualbricks/gui/gui.py:1142 virtualbricks/gui/gui.py:1164 #: virtualbricks/gui/gui.py:2741 virtualbricks/gui/gui.py:2763 msgid "Name" msgstr "" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:119 #: virtualbricks/gui/gui.py:132 virtualbricks/gui/gui.py:181 #: virtualbricks/gui/gui.py:214 virtualbricks/gui/gui.py:1138 #: virtualbricks/gui/gui.py:1160 virtualbricks/gui/gui.py:2737 #: virtualbricks/gui/gui.py:2759 msgid "Icon" msgstr "" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:197 #: virtualbricks/gui/gui.py:219 msgid "Status" msgstr "" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:206 #: virtualbricks/gui/gui.py:225 virtualbricks/gui/gui.py:1144 #: virtualbricks/gui/gui.py:1166 virtualbricks/gui/gui.py:2743 #: virtualbricks/gui/gui.py:2765 msgid "Parameters" msgstr "" #: virtualbricks/gui/gui.py:115 msgid "Address" msgstr "" #: virtualbricks/gui/gui.py:115 msgid "Autoconnect" msgstr "" #: virtualbricks/gui/gui.py:332 virtualbricks/gui/gui.py:1093 msgid "Command" msgstr "" #: virtualbricks/gui/gui.py:336 virtualbricks/gui/gui.py:1097 msgid "Host shell command" msgstr "" #: virtualbricks/gui/gui.py:443 msgid "KVM is disabled from Properties" msgstr "" #: virtualbricks/gui/gui.py:729 msgid "Show Settings" msgstr "" #: virtualbricks/gui/gui.py:755 virtualbricks/gui/gui.py:792 msgid "Hide Settings" msgstr "" #: virtualbricks/gui/gui.py:1040 virtualbricks/gui/gui.py:1047 msgid "Cannot create brick: Invalid name." msgstr "" #: virtualbricks/gui/gui.py:1064 virtualbricks/gui/gui.py:1068 msgid "The name \"" msgstr "" #: virtualbricks/gui/gui.py:1064 msgid "\" has forbidden format." msgstr "" #: virtualbricks/gui/gui.py:1068 msgid "\" has been adapted to \"" msgstr "" #: virtualbricks/gui/gui.py:1072 msgid "An event named \"" msgstr "" #: virtualbricks/gui/gui.py:1072 msgid "\" already exist." msgstr "" #: virtualbricks/gui/gui.py:1176 msgid "Bricks to add to the event to be started" msgstr "" #: virtualbricks/gui/gui.py:1180 msgid "Bricks to add to the event to be stopped" msgstr "" #: virtualbricks/gui/gui.py:1184 msgid "Events to add to the event to be started" msgstr "" #: virtualbricks/gui/gui.py:1189 msgid "Cannot create event: Invalid name." msgstr "" #: virtualbricks/gui/gui.py:1313 msgid "Help for parameter:" msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\n" "Jitter is the variation from the base value. Jitter 10 percent for a base " "value of 100 means the final value goes from 90 to 110. The distribution can " "be Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1326 msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path)." msgstr "" #: virtualbricks/gui/gui.py:1333 msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth." msgstr "" #: virtualbricks/gui/gui.py:1340 msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay." msgstr "" #: virtualbricks/gui/gui.py:1347 msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded." msgstr "" #: virtualbricks/gui/gui.py:1353 msgid "" "\t\t\tPACKET LOSS\n" "\n" "Percentage of loss as a floating point number." msgstr "" #: virtualbricks/gui/gui.py:1358 msgid "" "\t\t\tPACKET DUPLICATION\n" "\n" "Percentage of dup packet. Do not use dup factor 100% because it means that " "each packet is sent infinite times." msgstr "" #: virtualbricks/gui/gui.py:1364 msgid "" "\t\t\tNOISE\n" "\n" "Number of bits damaged/one megabyte (megabit)." msgstr "" #: virtualbricks/gui/gui.py:1369 msgid "" "\t\t\tLOST BURST\n" "\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts." msgstr "" #: virtualbricks/gui/gui.py:1375 msgid "" "\t\t\tMTU: MAXIMUM TRANSMISSION UNIT\n" "\n" "Packets longer than specified size are discarded." msgstr "" #: virtualbricks/gui/gui.py:1599 #, python-format msgid "Cannot start '%s': not configured" msgstr "" #: virtualbricks/gui/gui.py:1604 #, python-format msgid "Cannot start '%s': not connected" msgstr "" #: virtualbricks/gui/gui.py:1610 msgid "" "Loop link detected: aborting operation. If you want to start a looped " "network, disable the check loop feature in the general settings" msgstr "" #: virtualbricks/gui/gui.py:1618 msgid "Disk used by the VM is locked by another machine" msgstr "" #: virtualbricks/gui/gui.py:1892 msgid "Choose a filename first!" msgstr "" #: virtualbricks/gui/gui.py:2081 msgid "No KVM binary found" msgstr "" #: virtualbricks/gui/gui.py:2081 virtualbricks/gui/gui.py:2084 msgid "Check your active configuration" msgstr "" #: virtualbricks/gui/gui.py:2081 virtualbricks/gui/gui.py:2084 msgid "KVM will stay disabled" msgstr "" #: virtualbricks/gui/gui.py:2084 msgid "No KVM support found on the system" msgstr "" #: virtualbricks/gui/gui.py:2092 msgid "No KSM support found on the system" msgstr "" #: virtualbricks/gui/gui.py:2092 msgid "Check your configuration" msgstr "" #: virtualbricks/gui/gui.py:2092 msgid "KSM will stay disabled" msgstr "" #: virtualbricks/gui/gui.py:2106 msgid "The brick is still running, it will be killed before being deleted!\n" msgstr "" #: virtualbricks/gui/gui.py:2108 msgid "Do you really want to delete " msgstr "" #: virtualbricks/gui/gui.py:2117 msgid "This event is in use" msgstr "" #: virtualbricks/gui/gui.py:2119 msgid "Do you really want to delete" msgstr "" #: virtualbricks/gui/gui.py:2129 msgid "Cannot rename Brick: it is in use." msgstr "" #: virtualbricks/gui/gui.py:2155 virtualbricks/gui/gui.py:2167 #: virtualbricks/gui/gui.py:2226 msgid "Invalid name!" msgstr "" #: virtualbricks/gui/gui.py:2161 msgid "Cannot rename Event: it is in use." msgstr "" #: virtualbricks/gui/gui.py:2272 virtualbricks/gui/gui.py:2281 #: virtualbricks/gui/gui.py:2311 msgid "Error" msgstr "" #: virtualbricks/gui/gui.py:2272 msgid "invalid path for qemu binaries" msgstr "" #: virtualbricks/gui/gui.py:2281 msgid "cannot find neither qemu nor kvm in this path" msgstr "" #: virtualbricks/gui/gui.py:2285 virtualbricks/gui/gui.py:2288 msgid "Warning" msgstr "" #: virtualbricks/gui/gui.py:2285 msgid "cannot find qemu, using kvm only\n" msgstr "" #: virtualbricks/gui/gui.py:2288 msgid "kvm not found" msgstr "" #: virtualbricks/gui/gui.py:2288 msgid "KVM support disabled" msgstr "" #: virtualbricks/gui/gui.py:2290 msgid "KVM and Qemu detected" msgstr "" #: virtualbricks/gui/gui.py:2302 msgid "additional targets supported" msgstr "" #: virtualbricks/gui/gui.py:2311 msgid "invalid path for vde binaries" msgstr "" #: virtualbricks/gui/gui.py:2313 msgid "Warning, missing modules" msgstr "" #: virtualbricks/gui/gui.py:2318 msgid "All VDE components detected" msgstr "" #: virtualbricks/gui/gui.py:2384 msgid "" "No KVM binary found. Check your active configuration. KVM will stay disabled." msgstr "" #: virtualbricks/gui/gui.py:2387 msgid "" "No KVM support found on the system. Check your active configuration. KVM " "will stay disabled." msgstr "" #: virtualbricks/gui/gui.py:2558 msgid "Suspend/Resume not supported on this disk." msgstr "" #: virtualbricks/gui/gui.py:2583 msgid "Cannot find suspend point." msgstr "" #: virtualbricks/gui/gui.py:2615 msgid "Error saving topology: Invalid image format" msgstr "" #: virtualbricks/gui/gui.py:2617 msgid "Error saving topology: Could not write file" msgstr "" #: virtualbricks/gui/gui.py:2619 msgid "Error saving topology: Unknown error" msgstr "" #: virtualbricks/gui/gui.py:2774 msgid "Virtualbricks-Events to attach to the start/stop Brick Events" msgstr "" #: virtualbricks/gui/gui.py:2780 msgid "Save current project?" msgstr "" #: virtualbricks/gui/gui.py:2783 msgid "Open a project" msgstr "" #: virtualbricks/gui/gui.py:2786 virtualbricks/gui/gui.py:2806 #: virtualbricks/gui/gui.py:2836 msgid "Virtualbricks Bricks List" msgstr "" #: virtualbricks/gui/gui.py:2790 virtualbricks/gui/gui.py:2810 #: virtualbricks/gui/gui.py:2840 msgid "All files" msgstr "" #: virtualbricks/gui/gui.py:2802 msgid "Save as..." msgstr "" #: virtualbricks/gui/gui.py:2832 msgid "New project" msgstr "" #: virtualbricks/settings.py:86 #, python-format msgid "Configuration loaded ('%s')" msgstr "" #: virtualbricks/settings.py:88 msgid "Cannot read config file " msgstr "" #: virtualbricks/settings.py:90 msgid "Default configuration loaded" msgstr "" #: virtualbricks/settings.py:94 #, python-format msgid "Default configuration saved ('%s')" msgstr "" #: virtualbricks/settings.py:97 msgid "Cannot save default configuration" msgstr "" virtualbricks-1.0.2/locale/virtualbricks/fr.po000066400000000000000000003244251262207653100215060ustar00rootroot00000000000000# 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 , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: virtualbricks 0.4\n" "Report-Msgid-Bugs-To: qemulator-list@createweb.de\n" "POT-Creation-Date: 2011-06-01 22:47+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: share/virtualbricks.template.glade:10 msgid "Virtualbricks" msgstr "" #: share/virtualbricks.template.glade:27 msgid "_File" msgstr "" #: share/virtualbricks.template.glade:33 msgid "_Open Project" msgstr "" #: share/virtualbricks.template.glade:48 msgid "_Recent Projects..." msgstr "" #: share/virtualbricks.template.glade:68 msgid "Restart with _empty project" msgstr "" #: share/virtualbricks.template.glade:83 msgid "_Import bricks" msgstr "" #: share/virtualbricks.template.glade:98 msgid "_Save project as..." msgstr "" #: share/virtualbricks.template.glade:132 msgid "_Settings" msgstr "" #: share/virtualbricks.template.glade:140 msgid "configure Virtualbricks" msgstr "" #: share/virtualbricks.template.glade:150 msgid "auto show empty settings" msgstr "" #: share/virtualbricks.template.glade:159 msgid "auto hide stored settings" msgstr "" #: share/virtualbricks.template.glade:171 msgid "_View" msgstr "" #: share/virtualbricks.template.glade:179 msgid "_Messages" msgstr "" #: share/virtualbricks.template.glade:191 msgid "_Image creation" msgstr "" #: share/virtualbricks.template.glade:198 msgid "Not implemented yet" msgstr "" #: share/virtualbricks.template.glade:199 msgid "_Create new image" msgstr "" #: share/virtualbricks.template.glade:211 msgid "_Help" msgstr "" #: share/virtualbricks.template.glade:218 msgid "About Virtualbricks and QEMU" msgstr "" #: share/virtualbricks.template.glade:219 msgid "_About" msgstr "" #: share/virtualbricks.template.glade:271 msgid "Bricks:" msgstr "" #: share/virtualbricks.template.glade:298 msgid "New Brick" msgstr "" #: share/virtualbricks.template.glade:320 msgid "Start All Bricks" msgstr "" #: share/virtualbricks.template.glade:334 msgid "Stop All Bricks" msgstr "" #: share/virtualbricks.template.glade:361 msgid "" "You can use drag and drop to connect bricks and double click to start/stop " "them." msgstr "" #: share/virtualbricks.template.glade:378 virtualbricks/gui/gui.py:115 msgid "Bricks" msgstr "" #: share/virtualbricks.template.glade:396 msgid "New Event" msgstr "" #: share/virtualbricks.template.glade:418 msgid "Start All Events" msgstr "" #: share/virtualbricks.template.glade:432 msgid "Stop All Events" msgstr "" #: share/virtualbricks.template.glade:459 msgid "" "You can use drag and drop to add an event to events collation and double " "click to start/stop them." msgstr "" #: share/virtualbricks.template.glade:477 msgid "Events" msgstr "" #: share/virtualbricks.template.glade:494 msgid "" "Click to select an enty for use or edit its configuration, rightclick for " "more." msgstr "" #: share/virtualbricks.template.glade:508 msgid "Running" msgstr "" #: share/virtualbricks.template.glade:526 msgid "Add host:" msgstr "" #: share/virtualbricks.template.glade:601 msgid "Remote Sessions" msgstr "" #: share/virtualbricks.template.glade:637 msgid "Export as Image" msgstr "" #: share/virtualbricks.template.glade:653 msgid "Expand Horizontally" msgstr "" #: share/virtualbricks.template.glade:668 msgid "Expand Vertically" msgstr "" #: share/virtualbricks.template.glade:725 msgid "Topology" msgstr "" #: share/virtualbricks.template.glade:744 msgid "Show/hide configuration panel for selected boot image" msgstr "" #: share/virtualbricks.template.glade:769 msgid "Show settings" msgstr "" #: share/virtualbricks.template.glade:839 msgid "boot as device" msgstr "" #: share/virtualbricks.template.glade:871 msgid "Snapshot mode" msgstr "" #: share/virtualbricks.template.glade:876 msgid "write to temporary files instead of disk image files" msgstr "" #: share/virtualbricks.template.glade:902 msgid "boot options" msgstr "" #: share/virtualbricks.template.glade:931 msgid "use image as cdrom" msgstr "" #: share/virtualbricks.template.glade:936 msgid "use one of the image files in the default folder as cdrom device" msgstr "" #: share/virtualbricks.template.glade:951 msgid "mount cdrom" msgstr "" #: share/virtualbricks.template.glade:956 msgid "mount local cdrom Drive" msgstr "" #: share/virtualbricks.template.glade:970 msgid "no cdrom" msgstr "" #: share/virtualbricks.template.glade:975 msgid "don´t use any cdrom device" msgstr "" #: share/virtualbricks.template.glade:990 msgid "/dev/cdrom\n" msgstr "" #: share/virtualbricks.template.glade:1062 msgid "cdrom device" msgstr "" #: share/virtualbricks.template.glade:1110 msgid "Select images for Qemu volumes" msgstr "" #: share/virtualbricks.template.glade:1134 #: share/virtualbricks.template.glade:12317 #: share/virtualbricks.template.glade:12354 msgid "fdb" msgstr "" #: share/virtualbricks.template.glade:1148 #: share/virtualbricks.template.glade:12302 #: share/virtualbricks.template.glade:12339 msgid "fda" msgstr "" #: share/virtualbricks.template.glade:1162 msgid "hdd" msgstr "" #: share/virtualbricks.template.glade:1176 msgid "hdc" msgstr "" #: share/virtualbricks.template.glade:1190 msgid "hdb" msgstr "" #: share/virtualbricks.template.glade:1204 msgid "hda" msgstr "" #: share/virtualbricks.template.glade:1315 msgid "mtdblock" msgstr "" #: share/virtualbricks.template.glade:1360 #: share/virtualbricks.template.glade:1401 #: share/virtualbricks.template.glade:1444 #: share/virtualbricks.template.glade:1487 #: share/virtualbricks.template.glade:1530 #: share/virtualbricks.template.glade:1573 #: share/virtualbricks.template.glade:1616 msgid "Private COW" msgstr "" #: share/virtualbricks.template.glade:1648 msgid "additional media" msgstr "" #: share/virtualbricks.template.glade:1685 #: share/virtualbricks.template.glade:12383 #: share/virtualbricks.template.glade:12420 msgid "Drives" msgstr "" #: share/virtualbricks.template.glade:1723 msgid "Architecture: " msgstr "" #: share/virtualbricks.template.glade:1752 #: share/virtualbricks.template.glade:1802 msgid "\n" msgstr "" #: share/virtualbricks.template.glade:1764 msgid "CPU Type" msgstr "" #: share/virtualbricks.template.glade:1776 msgid "" "\n" "\n" msgstr "" #: share/virtualbricks.template.glade:1790 msgid "Machine type" msgstr "" #: share/virtualbricks.template.glade:1813 #: share/virtualbricks.template.glade:1816 msgid "KVM" msgstr "" #: share/virtualbricks.template.glade:1833 #: share/virtualbricks.template.glade:1870 msgid "System and machine" msgstr "" #: share/virtualbricks.template.glade:1891 #: share/virtualbricks.template.glade:1928 msgid "disable graphical output" msgstr "" #: share/virtualbricks.template.glade:1896 #: share/virtualbricks.template.glade:1933 msgid "disable graphical output and redirect serial I/Os to console" msgstr "" #: share/virtualbricks.template.glade:1923 #: share/virtualbricks.template.glade:1960 msgid "Use VGA instead of Default" msgstr "" #: share/virtualbricks.template.glade:1928 #: share/virtualbricks.template.glade:1965 msgid "" "simulate a standard VGA card with VESA Bochs Extensions (default is CL-" "GD5446 PCI VGA)" msgstr "" #: share/virtualbricks.template.glade:1943 #: share/virtualbricks.template.glade:1980 msgid "Start in vncserver" msgstr "" #: share/virtualbricks.template.glade:1948 #: share/virtualbricks.template.glade:1985 msgid "start emulation in a VNC server on display" msgstr "" #: share/virtualbricks.template.glade:1962 #: share/virtualbricks.template.glade:1999 msgid "on Display: " msgstr "" #: share/virtualbricks.template.glade:1974 #: share/virtualbricks.template.glade:2011 msgid "select Dsiplay for VNC server" msgstr "" #: share/virtualbricks.template.glade:1992 #: share/virtualbricks.template.glade:2029 msgid "SDL" msgstr "" #: share/virtualbricks.template.glade:2004 #: share/virtualbricks.template.glade:2041 msgid "Portrait" msgstr "" #: share/virtualbricks.template.glade:2026 #: share/virtualbricks.template.glade:2063 msgid "Display Options" msgstr "" #: share/virtualbricks.template.glade:2055 #: share/virtualbricks.template.glade:2092 msgid "enable usb" msgstr "" #: share/virtualbricks.template.glade:2060 #: share/virtualbricks.template.glade:2097 msgid "enable access to usb" msgstr "" #: share/virtualbricks.template.glade:2091 #: share/virtualbricks.template.glade:2128 msgid "USB settings" msgstr "" #: share/virtualbricks.template.glade:2128 #: share/virtualbricks.template.glade:2165 msgid "Set realtime clock to local time" msgstr "" #: share/virtualbricks.template.glade:2133 #: share/virtualbricks.template.glade:2170 msgid "set the real time clock to local time [default=utc]" msgstr "" #: share/virtualbricks.template.glade:2145 #: share/virtualbricks.template.glade:2182 msgid "Guest time drift compensation (TDF)" msgstr "" #: share/virtualbricks.template.glade:2163 #: share/virtualbricks.template.glade:2200 msgid "Keyboard: " msgstr "" #: share/virtualbricks.template.glade:2193 #: share/virtualbricks.template.glade:2230 msgid "Serial" msgstr "" #: share/virtualbricks.template.glade:2210 #: share/virtualbricks.template.glade:2247 msgid "Extra Settings" msgstr "" #: share/virtualbricks.template.glade:2256 #: share/virtualbricks.template.glade:2293 msgid "select emulated Soundcard " msgstr "" #: share/virtualbricks.template.glade:2284 #: share/virtualbricks.template.glade:2626 #: share/virtualbricks.template.glade:3463 #: share/virtualbricks.template.glade:3484 #: share/virtualbricks.template.glade:10116 #: share/virtualbricks.template.glade:10137 #: share/virtualbricks.template.glade:10289 #: share/virtualbricks.template.glade:10508 #: share/virtualbricks.template.glade:2321 #: share/virtualbricks.template.glade:2663 #: share/virtualbricks.template.glade:3500 #: share/virtualbricks.template.glade:3521 #: share/virtualbricks.template.glade:10153 #: share/virtualbricks.template.glade:10174 #: share/virtualbricks.template.glade:10326 #: share/virtualbricks.template.glade:10545 msgid " \n" msgstr "" #: share/virtualbricks.template.glade:2300 #: share/virtualbricks.template.glade:2337 msgid "Audio Device Settings" msgstr "" #: share/virtualbricks.template.glade:2329 #: share/virtualbricks.template.glade:2366 msgid "Used RAM:" msgstr "" #: share/virtualbricks.template.glade:2355 #: share/virtualbricks.template.glade:2402 #: share/virtualbricks.template.glade:2392 #: share/virtualbricks.template.glade:2439 msgid " MB" msgstr "" #: share/virtualbricks.template.glade:2373 #: share/virtualbricks.template.glade:2410 msgid "KVM Shadow Memory: " msgstr "" #: share/virtualbricks.template.glade:2420 #: share/virtualbricks.template.glade:2457 msgid "Memory Settings" msgstr "" #: share/virtualbricks.template.glade:2481 #: share/virtualbricks.template.glade:2518 msgid "System" msgstr "" #: share/virtualbricks.template.glade:2507 #: share/virtualbricks.template.glade:2544 msgid "Disable networking" msgstr "" #: share/virtualbricks.template.glade:2534 #: share/virtualbricks.template.glade:2571 msgid "No Network" msgstr "" #: share/virtualbricks.template.glade:2561 #: share/virtualbricks.template.glade:2598 msgid "Start with usermode network (default)" msgstr "" #: share/virtualbricks.template.glade:2587 #: share/virtualbricks.template.glade:2624 msgid "Connect to network" msgstr "" #: share/virtualbricks.template.glade:2613 #: share/virtualbricks.template.glade:9901 #: share/virtualbricks.template.glade:2650 #: share/virtualbricks.template.glade:9938 msgid "Connect to:" msgstr "" #: share/virtualbricks.template.glade:2637 #: share/virtualbricks.template.glade:2674 msgid "Virtual ethernet model:" msgstr "" #: share/virtualbricks.template.glade:2648 #: share/virtualbricks.template.glade:2685 msgid "" "\n" "rtl8139\n" "e1000\n" "virtio\n" "i82551\n" "i82557b\n" "i82559er\n" "ne2k_pci\n" "pcnet\n" "ne2k_isa\n" msgstr "" #: share/virtualbricks.template.glade:2668 #: share/virtualbricks.template.glade:2705 msgid "Mac address:" msgstr "" #: share/virtualbricks.template.glade:2689 #: share/virtualbricks.template.glade:2726 msgid "Randomize" msgstr "" #: share/virtualbricks.template.glade:2719 #: share/virtualbricks.template.glade:2756 msgid "Set up a new network card" msgstr "" #: share/virtualbricks.template.glade:2746 #: share/virtualbricks.template.glade:2783 msgid "Add Network card" msgstr "" #: share/virtualbricks.template.glade:2772 #: share/virtualbricks.template.glade:2809 msgid "Edit selected network card or redirection" msgstr "" #: share/virtualbricks.template.glade:2799 #: share/virtualbricks.template.glade:2836 msgid "Edit" msgstr "" #: share/virtualbricks.template.glade:2825 #: share/virtualbricks.template.glade:2862 msgid "Remove selected network card or redirection" msgstr "" #: share/virtualbricks.template.glade:2853 #: share/virtualbricks.template.glade:11302 #: share/virtualbricks.template.glade:2890 #: share/virtualbricks.template.glade:11339 msgid "Remove" msgstr "" #: share/virtualbricks.template.glade:2913 #: share/virtualbricks.template.glade:2950 msgid "SMB share" msgstr "" #: share/virtualbricks.template.glade:2938 #: share/virtualbricks.template.glade:2975 msgid "SMB Share" msgstr "" #: share/virtualbricks.template.glade:2994 #: share/virtualbricks.template.glade:3031 msgid "Network cards" msgstr "" #: share/virtualbricks.template.glade:3027 #: share/virtualbricks.template.glade:3064 msgid "Network" msgstr "" #: share/virtualbricks.template.glade:3055 #: share/virtualbricks.template.glade:3092 msgid "Use a custom kernel" msgstr "" #: share/virtualbricks.template.glade:3068 #: share/virtualbricks.template.glade:3105 msgid "Specify initial ramdisk" msgstr "" #: share/virtualbricks.template.glade:3099 #: share/virtualbricks.template.glade:3136 msgid "Parameters to append to command line:" msgstr "" #: share/virtualbricks.template.glade:3211 #: share/virtualbricks.template.glade:3248 msgid "Enable kernel debugging" msgstr "" #: share/virtualbricks.template.glade:3226 #: share/virtualbricks.template.glade:3263 msgid "GNU debugger TCP port:" msgstr "" #: share/virtualbricks.template.glade:3259 #: share/virtualbricks.template.glade:3296 msgid "Booting Linux" msgstr "" #: share/virtualbricks.template.glade:3286 #: share/virtualbricks.template.glade:3323 msgid "Customize Linux Boot" msgstr "" #: share/virtualbricks.template.glade:3379 #: share/virtualbricks.template.glade:3416 msgid "Virtual Machine Icon" msgstr "" #: share/virtualbricks.template.glade:3419 #: share/virtualbricks.template.glade:3456 msgid "Others" msgstr "" #: share/virtualbricks.template.glade:3473 #: share/virtualbricks.template.glade:10126 #: share/virtualbricks.template.glade:3510 #: share/virtualbricks.template.glade:10163 msgid "<=== connect ===>" msgstr "" #: share/virtualbricks.template.glade:3502 #: share/virtualbricks.template.glade:3539 msgid "Plugs" msgstr "" #: share/virtualbricks.template.glade:3532 #: share/virtualbricks.template.glade:4256 #: share/virtualbricks.template.glade:5024 #: share/virtualbricks.template.glade:5745 #: share/virtualbricks.template.glade:6488 #: share/virtualbricks.template.glade:7209 #: share/virtualbricks.template.glade:7950 #: share/virtualbricks.template.glade:8675 #: share/virtualbricks.template.glade:9407 #: share/virtualbricks.template.glade:3569 #: share/virtualbricks.template.glade:4293 #: share/virtualbricks.template.glade:5061 #: share/virtualbricks.template.glade:5782 #: share/virtualbricks.template.glade:6525 #: share/virtualbricks.template.glade:7246 #: share/virtualbricks.template.glade:7987 #: share/virtualbricks.template.glade:8712 #: share/virtualbricks.template.glade:9444 msgid "Symmetrical" msgstr "" #: share/virtualbricks.template.glade:3550 #: share/virtualbricks.template.glade:5042 #: share/virtualbricks.template.glade:5763 #: share/virtualbricks.template.glade:6506 #: share/virtualbricks.template.glade:7227 #: share/virtualbricks.template.glade:7968 #: share/virtualbricks.template.glade:8693 #: share/virtualbricks.template.glade:9425 #: share/virtualbricks.template.glade:3587 #: share/virtualbricks.template.glade:5079 #: share/virtualbricks.template.glade:5800 #: share/virtualbricks.template.glade:6543 #: share/virtualbricks.template.glade:7264 #: share/virtualbricks.template.glade:8005 #: share/virtualbricks.template.glade:8730 #: share/virtualbricks.template.glade:9462 msgid "Multiplier" msgstr "" #: share/virtualbricks.template.glade:3579 #: share/virtualbricks.template.glade:4303 #: share/virtualbricks.template.glade:5069 #: share/virtualbricks.template.glade:5792 #: share/virtualbricks.template.glade:6533 #: share/virtualbricks.template.glade:7254 #: share/virtualbricks.template.glade:7998 #: share/virtualbricks.template.glade:8720 #: share/virtualbricks.template.glade:9454 #: share/virtualbricks.template.glade:3616 #: share/virtualbricks.template.glade:4340 #: share/virtualbricks.template.glade:5106 #: share/virtualbricks.template.glade:5829 #: share/virtualbricks.template.glade:6570 #: share/virtualbricks.template.glade:7291 #: share/virtualbricks.template.glade:8035 #: share/virtualbricks.template.glade:8757 #: share/virtualbricks.template.glade:9491 msgid "UM" msgstr "" #: share/virtualbricks.template.glade:3605 #: share/virtualbricks.template.glade:4329 #: share/virtualbricks.template.glade:5094 #: share/virtualbricks.template.glade:5817 #: share/virtualbricks.template.glade:6558 #: share/virtualbricks.template.glade:7279 #: share/virtualbricks.template.glade:8024 #: share/virtualbricks.template.glade:8745 #: share/virtualbricks.template.glade:9480 #: share/virtualbricks.template.glade:3642 #: share/virtualbricks.template.glade:4366 #: share/virtualbricks.template.glade:5131 #: share/virtualbricks.template.glade:5854 #: share/virtualbricks.template.glade:6595 #: share/virtualbricks.template.glade:7316 #: share/virtualbricks.template.glade:8061 #: share/virtualbricks.template.glade:8782 #: share/virtualbricks.template.glade:9517 msgid "General parameters" msgstr "" #: share/virtualbricks.template.glade:3632 #: share/virtualbricks.template.glade:3819 #: share/virtualbricks.template.glade:4015 #: share/virtualbricks.template.glade:4356 #: share/virtualbricks.template.glade:4543 #: share/virtualbricks.template.glade:4739 #: share/virtualbricks.template.glade:5121 #: share/virtualbricks.template.glade:5308 #: share/virtualbricks.template.glade:5504 #: share/virtualbricks.template.glade:5844 #: share/virtualbricks.template.glade:6031 #: share/virtualbricks.template.glade:6227 #: share/virtualbricks.template.glade:6585 #: share/virtualbricks.template.glade:6772 #: share/virtualbricks.template.glade:6968 #: share/virtualbricks.template.glade:7306 #: share/virtualbricks.template.glade:7493 #: share/virtualbricks.template.glade:7689 #: share/virtualbricks.template.glade:8051 #: share/virtualbricks.template.glade:8238 #: share/virtualbricks.template.glade:8434 #: share/virtualbricks.template.glade:8772 #: share/virtualbricks.template.glade:8959 #: share/virtualbricks.template.glade:9155 #: share/virtualbricks.template.glade:9507 #: share/virtualbricks.template.glade:9577 #: share/virtualbricks.template.glade:9656 #: share/virtualbricks.template.glade:3669 #: share/virtualbricks.template.glade:3856 #: share/virtualbricks.template.glade:4052 #: share/virtualbricks.template.glade:4393 #: share/virtualbricks.template.glade:4580 #: share/virtualbricks.template.glade:4776 #: share/virtualbricks.template.glade:5158 #: share/virtualbricks.template.glade:5345 #: share/virtualbricks.template.glade:5541 #: share/virtualbricks.template.glade:5881 #: share/virtualbricks.template.glade:6068 #: share/virtualbricks.template.glade:6264 #: share/virtualbricks.template.glade:6622 #: share/virtualbricks.template.glade:6809 #: share/virtualbricks.template.glade:7005 #: share/virtualbricks.template.glade:7343 #: share/virtualbricks.template.glade:7530 #: share/virtualbricks.template.glade:7726 #: share/virtualbricks.template.glade:8088 #: share/virtualbricks.template.glade:8275 #: share/virtualbricks.template.glade:8471 #: share/virtualbricks.template.glade:8809 #: share/virtualbricks.template.glade:8996 #: share/virtualbricks.template.glade:9192 #: share/virtualbricks.template.glade:9544 #: share/virtualbricks.template.glade:9614 #: share/virtualbricks.template.glade:9693 msgid "Base" msgstr "" #: share/virtualbricks.template.glade:3671 #: share/virtualbricks.template.glade:3858 #: share/virtualbricks.template.glade:4054 #: share/virtualbricks.template.glade:4395 #: share/virtualbricks.template.glade:4582 #: share/virtualbricks.template.glade:4778 #: share/virtualbricks.template.glade:5160 #: share/virtualbricks.template.glade:5347 #: share/virtualbricks.template.glade:5543 #: share/virtualbricks.template.glade:5883 #: share/virtualbricks.template.glade:6070 #: share/virtualbricks.template.glade:6266 #: share/virtualbricks.template.glade:6624 #: share/virtualbricks.template.glade:6811 #: share/virtualbricks.template.glade:7007 #: share/virtualbricks.template.glade:7345 #: share/virtualbricks.template.glade:7532 #: share/virtualbricks.template.glade:7728 #: share/virtualbricks.template.glade:8090 #: share/virtualbricks.template.glade:8277 #: share/virtualbricks.template.glade:8473 #: share/virtualbricks.template.glade:8811 #: share/virtualbricks.template.glade:8998 #: share/virtualbricks.template.glade:9194 #: share/virtualbricks.template.glade:3708 #: share/virtualbricks.template.glade:3895 #: share/virtualbricks.template.glade:4091 #: share/virtualbricks.template.glade:4432 #: share/virtualbricks.template.glade:4619 #: share/virtualbricks.template.glade:4815 #: share/virtualbricks.template.glade:5197 #: share/virtualbricks.template.glade:5384 #: share/virtualbricks.template.glade:5580 #: share/virtualbricks.template.glade:5920 #: share/virtualbricks.template.glade:6107 #: share/virtualbricks.template.glade:6303 #: share/virtualbricks.template.glade:6661 #: share/virtualbricks.template.glade:6848 #: share/virtualbricks.template.glade:7044 #: share/virtualbricks.template.glade:7382 #: share/virtualbricks.template.glade:7569 #: share/virtualbricks.template.glade:7765 #: share/virtualbricks.template.glade:8127 #: share/virtualbricks.template.glade:8314 #: share/virtualbricks.template.glade:8510 #: share/virtualbricks.template.glade:8848 #: share/virtualbricks.template.glade:9035 #: share/virtualbricks.template.glade:9231 msgid "±" msgstr "" #: share/virtualbricks.template.glade:3692 #: share/virtualbricks.template.glade:3879 #: share/virtualbricks.template.glade:4075 #: share/virtualbricks.template.glade:4416 #: share/virtualbricks.template.glade:4603 #: share/virtualbricks.template.glade:4799 #: share/virtualbricks.template.glade:5181 #: share/virtualbricks.template.glade:5368 #: share/virtualbricks.template.glade:5564 #: share/virtualbricks.template.glade:5904 #: share/virtualbricks.template.glade:6091 #: share/virtualbricks.template.glade:6287 #: share/virtualbricks.template.glade:6645 #: share/virtualbricks.template.glade:6832 #: share/virtualbricks.template.glade:7028 #: share/virtualbricks.template.glade:7366 #: share/virtualbricks.template.glade:7553 #: share/virtualbricks.template.glade:7749 #: share/virtualbricks.template.glade:8111 #: share/virtualbricks.template.glade:8298 #: share/virtualbricks.template.glade:8494 #: share/virtualbricks.template.glade:8832 #: share/virtualbricks.template.glade:9019 #: share/virtualbricks.template.glade:9215 #: share/virtualbricks.template.glade:3729 #: share/virtualbricks.template.glade:3916 #: share/virtualbricks.template.glade:4112 #: share/virtualbricks.template.glade:4453 #: share/virtualbricks.template.glade:4640 #: share/virtualbricks.template.glade:4836 #: share/virtualbricks.template.glade:5218 #: share/virtualbricks.template.glade:5405 #: share/virtualbricks.template.glade:5601 #: share/virtualbricks.template.glade:5941 #: share/virtualbricks.template.glade:6128 #: share/virtualbricks.template.glade:6324 #: share/virtualbricks.template.glade:6682 #: share/virtualbricks.template.glade:6869 #: share/virtualbricks.template.glade:7065 #: share/virtualbricks.template.glade:7403 #: share/virtualbricks.template.glade:7590 #: share/virtualbricks.template.glade:7786 #: share/virtualbricks.template.glade:8148 #: share/virtualbricks.template.glade:8335 #: share/virtualbricks.template.glade:8531 #: share/virtualbricks.template.glade:8869 #: share/virtualbricks.template.glade:9056 #: share/virtualbricks.template.glade:9252 msgid "Jitter" msgstr "" #: share/virtualbricks.template.glade:3731 #: share/virtualbricks.template.glade:3918 #: share/virtualbricks.template.glade:4114 #: share/virtualbricks.template.glade:4455 #: share/virtualbricks.template.glade:4642 #: share/virtualbricks.template.glade:4838 #: share/virtualbricks.template.glade:5220 #: share/virtualbricks.template.glade:5407 #: share/virtualbricks.template.glade:5603 #: share/virtualbricks.template.glade:5943 #: share/virtualbricks.template.glade:6130 #: share/virtualbricks.template.glade:6326 #: share/virtualbricks.template.glade:6684 #: share/virtualbricks.template.glade:6871 #: share/virtualbricks.template.glade:7067 #: share/virtualbricks.template.glade:7405 #: share/virtualbricks.template.glade:7592 #: share/virtualbricks.template.glade:7788 #: share/virtualbricks.template.glade:8150 #: share/virtualbricks.template.glade:8337 #: share/virtualbricks.template.glade:8533 #: share/virtualbricks.template.glade:8871 #: share/virtualbricks.template.glade:9058 #: share/virtualbricks.template.glade:9254 #: share/virtualbricks.template.glade:3768 #: share/virtualbricks.template.glade:3955 #: share/virtualbricks.template.glade:4151 #: share/virtualbricks.template.glade:4492 #: share/virtualbricks.template.glade:4679 #: share/virtualbricks.template.glade:4875 #: share/virtualbricks.template.glade:5257 #: share/virtualbricks.template.glade:5444 #: share/virtualbricks.template.glade:5640 #: share/virtualbricks.template.glade:5980 #: share/virtualbricks.template.glade:6167 #: share/virtualbricks.template.glade:6363 #: share/virtualbricks.template.glade:6721 #: share/virtualbricks.template.glade:6908 #: share/virtualbricks.template.glade:7104 #: share/virtualbricks.template.glade:7442 #: share/virtualbricks.template.glade:7629 #: share/virtualbricks.template.glade:7825 #: share/virtualbricks.template.glade:8187 #: share/virtualbricks.template.glade:8374 #: share/virtualbricks.template.glade:8570 #: share/virtualbricks.template.glade:8908 #: share/virtualbricks.template.glade:9095 #: share/virtualbricks.template.glade:9291 msgid "%" msgstr "" #: share/virtualbricks.template.glade:3751 #: share/virtualbricks.template.glade:3938 #: share/virtualbricks.template.glade:4134 #: share/virtualbricks.template.glade:4858 #: share/virtualbricks.template.glade:5240 #: share/virtualbricks.template.glade:5427 #: share/virtualbricks.template.glade:5623 #: share/virtualbricks.template.glade:5963 #: share/virtualbricks.template.glade:6150 #: share/virtualbricks.template.glade:6346 #: share/virtualbricks.template.glade:6704 #: share/virtualbricks.template.glade:6891 #: share/virtualbricks.template.glade:7087 #: share/virtualbricks.template.glade:7425 #: share/virtualbricks.template.glade:7612 #: share/virtualbricks.template.glade:7808 #: share/virtualbricks.template.glade:8170 #: share/virtualbricks.template.glade:8357 #: share/virtualbricks.template.glade:8553 #: share/virtualbricks.template.glade:8891 #: share/virtualbricks.template.glade:9078 #: share/virtualbricks.template.glade:9274 #: share/virtualbricks.template.glade:3788 #: share/virtualbricks.template.glade:3975 #: share/virtualbricks.template.glade:4171 #: share/virtualbricks.template.glade:4895 #: share/virtualbricks.template.glade:5277 #: share/virtualbricks.template.glade:5464 #: share/virtualbricks.template.glade:5660 #: share/virtualbricks.template.glade:6000 #: share/virtualbricks.template.glade:6187 #: share/virtualbricks.template.glade:6383 #: share/virtualbricks.template.glade:6741 #: share/virtualbricks.template.glade:6928 #: share/virtualbricks.template.glade:7124 #: share/virtualbricks.template.glade:7462 #: share/virtualbricks.template.glade:7649 #: share/virtualbricks.template.glade:7845 #: share/virtualbricks.template.glade:8207 #: share/virtualbricks.template.glade:8394 #: share/virtualbricks.template.glade:8590 #: share/virtualbricks.template.glade:8928 #: share/virtualbricks.template.glade:9115 #: share/virtualbricks.template.glade:9311 msgid "Distrib." msgstr "" #: share/virtualbricks.template.glade:3780 #: share/virtualbricks.template.glade:4504 #: share/virtualbricks.template.glade:5269 #: share/virtualbricks.template.glade:5992 #: share/virtualbricks.template.glade:6733 #: share/virtualbricks.template.glade:7454 #: share/virtualbricks.template.glade:8199 #: share/virtualbricks.template.glade:8920 #: share/virtualbricks.template.glade:9538 #: share/virtualbricks.template.glade:3817 #: share/virtualbricks.template.glade:4541 #: share/virtualbricks.template.glade:5306 #: share/virtualbricks.template.glade:6029 #: share/virtualbricks.template.glade:6770 #: share/virtualbricks.template.glade:7491 #: share/virtualbricks.template.glade:8236 #: share/virtualbricks.template.glade:8957 #: share/virtualbricks.template.glade:9575 msgid "Left to Right" msgstr "" #: share/virtualbricks.template.glade:3975 #: share/virtualbricks.template.glade:4699 #: share/virtualbricks.template.glade:5464 #: share/virtualbricks.template.glade:6187 #: share/virtualbricks.template.glade:6928 #: share/virtualbricks.template.glade:7649 #: share/virtualbricks.template.glade:8394 #: share/virtualbricks.template.glade:9115 #: share/virtualbricks.template.glade:9616 #: share/virtualbricks.template.glade:4012 #: share/virtualbricks.template.glade:4736 #: share/virtualbricks.template.glade:5501 #: share/virtualbricks.template.glade:6224 #: share/virtualbricks.template.glade:6965 #: share/virtualbricks.template.glade:7686 #: share/virtualbricks.template.glade:8431 #: share/virtualbricks.template.glade:9152 #: share/virtualbricks.template.glade:9653 msgid "Both Directions" msgstr "" #: share/virtualbricks.template.glade:4172 #: share/virtualbricks.template.glade:4896 #: share/virtualbricks.template.glade:5661 #: share/virtualbricks.template.glade:6384 #: share/virtualbricks.template.glade:7125 #: share/virtualbricks.template.glade:7846 #: share/virtualbricks.template.glade:8591 #: share/virtualbricks.template.glade:9312 #: share/virtualbricks.template.glade:9696 #: share/virtualbricks.template.glade:4209 #: share/virtualbricks.template.glade:4933 #: share/virtualbricks.template.glade:5698 #: share/virtualbricks.template.glade:6421 #: share/virtualbricks.template.glade:7162 #: share/virtualbricks.template.glade:7883 #: share/virtualbricks.template.glade:8628 #: share/virtualbricks.template.glade:9349 #: share/virtualbricks.template.glade:9733 msgid "Right to Left" msgstr "" #: share/virtualbricks.template.glade:4198 #: share/virtualbricks.template.glade:4235 msgid "Bandwidth Restriction" msgstr "" #: share/virtualbricks.template.glade:4484 #: share/virtualbricks.template.glade:4671 #: share/virtualbricks.template.glade:4521 msgid "" "Uniform\n" "Gaussian" msgstr "" #: share/virtualbricks.template.glade:4922 #: share/virtualbricks.template.glade:4959 msgid "Interface Speed" msgstr "" #: share/virtualbricks.template.glade:4941 #: share/virtualbricks.template.glade:4978 msgid "Enable(advanced)" msgstr "" #: share/virtualbricks.template.glade:4993 #: share/virtualbricks.template.glade:5030 msgid "Bandwidth" msgstr "" #: share/virtualbricks.template.glade:5687 #: share/virtualbricks.template.glade:5724 msgid "Packet Delay" msgstr "" #: share/virtualbricks.template.glade:6410 #: share/virtualbricks.template.glade:6447 msgid "Channel Buffer Size" msgstr "" #: share/virtualbricks.template.glade:6458 virtualbricks/brickfactory.py:822 #: share/virtualbricks.template.glade:6495 virtualbricks/brickfactory.py:885 msgid "Delay" msgstr "" #: share/virtualbricks.template.glade:7151 #: share/virtualbricks.template.glade:7188 msgid "Packet Loss" msgstr "" #: share/virtualbricks.template.glade:7872 #: share/virtualbricks.template.glade:7909 msgid "Packet Duplication" msgstr "" #: share/virtualbricks.template.glade:7920 #: share/virtualbricks.template.glade:7957 msgid "Disruptions 1/3" msgstr "" #: share/virtualbricks.template.glade:8617 #: share/virtualbricks.template.glade:8654 msgid "Noise" msgstr "" #: share/virtualbricks.template.glade:9338 #: share/virtualbricks.template.glade:9375 msgid "Lost Burst" msgstr "" #: share/virtualbricks.template.glade:9376 #: share/virtualbricks.template.glade:9413 msgid "Disruptions 2/3" msgstr "" #: share/virtualbricks.template.glade:9463 msgid "" "bits\n" "bytes" msgstr "" #: share/virtualbricks.template.glade:9722 #: share/virtualbricks.template.glade:9759 msgid "Maximum Transmission Unit (MTU)" msgstr "" #: share/virtualbricks.template.glade:9764 #: share/virtualbricks.template.glade:9801 msgid "Disruptions 3/3" msgstr "" #: share/virtualbricks.template.glade:9800 #: share/virtualbricks.template.glade:9837 msgid "Number of ports: " msgstr "" #: share/virtualbricks.template.glade:9826 #: share/virtualbricks.template.glade:9863 msgid "Use FSTP" msgstr "" #: share/virtualbricks.template.glade:9838 #: share/virtualbricks.template.glade:9875 msgid "Hub mode" msgstr "" #: share/virtualbricks.template.glade:9860 #: share/virtualbricks.template.glade:9897 msgid "Switch Configuration" msgstr "" #: share/virtualbricks.template.glade:9910 #: share/virtualbricks.template.glade:9947 msgid "" " \n" "\n" msgstr "" #: share/virtualbricks.template.glade:9941 #: share/virtualbricks.template.glade:9978 msgid "Don't touch interface settings" msgstr "" #: share/virtualbricks.template.glade:9951 #: share/virtualbricks.template.glade:9988 msgid "Use DHCP" msgstr "" #: share/virtualbricks.template.glade:9966 #: share/virtualbricks.template.glade:10003 msgid "Manual settings" msgstr "" #: share/virtualbricks.template.glade:9996 #: share/virtualbricks.template.glade:10033 msgid "IP Address: " msgstr "" #: share/virtualbricks.template.glade:10003 #: share/virtualbricks.template.glade:10040 msgid "Netmask: " msgstr "" #: share/virtualbricks.template.glade:10014 #: share/virtualbricks.template.glade:10051 msgid "Gateway: " msgstr "" #: share/virtualbricks.template.glade:10028 #: share/virtualbricks.template.glade:10065 msgid "10.0.0.1" msgstr "" #: share/virtualbricks.template.glade:10043 #: share/virtualbricks.template.glade:10080 msgid "255.0.0.0" msgstr "" #: share/virtualbricks.template.glade:10084 #: share/virtualbricks.template.glade:10121 msgid "Tap Configuration" msgstr "" #: share/virtualbricks.template.glade:10177 #: share/virtualbricks.template.glade:14202 #: share/virtualbricks.template.glade:10214 #: share/virtualbricks.template.glade:14239 msgid "Delay:" msgstr "" #: share/virtualbricks.template.glade:10209 virtualbricks/brickfactory.py:825 #: share/virtualbricks.template.glade:10246 virtualbricks/brickfactory.py:888 msgid "Actions" msgstr "" #: share/virtualbricks.template.glade:10248 #: share/virtualbricks.template.glade:10285 msgid "Event Configuration" msgstr "" #: share/virtualbricks.template.glade:10283 #: share/virtualbricks.template.glade:10398 #: share/virtualbricks.template.glade:10320 #: share/virtualbricks.template.glade:10435 msgid "Connect to" msgstr "" #: share/virtualbricks.template.glade:10315 #: share/virtualbricks.template.glade:10352 msgid "Listen to port:" msgstr "" #: share/virtualbricks.template.glade:10325 #: share/virtualbricks.template.glade:10362 msgid "Expect password:" msgstr "" #: share/virtualbricks.template.glade:10364 #: share/virtualbricks.template.glade:10401 msgid "Tunnel server Configuration" msgstr "" #: share/virtualbricks.template.glade:10418 #: share/virtualbricks.template.glade:12758 #: share/virtualbricks.template.glade:10455 #: share/virtualbricks.template.glade:12795 msgid "port:" msgstr "" #: share/virtualbricks.template.glade:10448 #: share/virtualbricks.template.glade:13780 #: share/virtualbricks.template.glade:10485 #: share/virtualbricks.template.glade:13817 msgid "Tunnel Server" msgstr "" #: share/virtualbricks.template.glade:10473 #: share/virtualbricks.template.glade:10510 msgid "Password:" msgstr "" #: share/virtualbricks.template.glade:10484 #: share/virtualbricks.template.glade:10521 msgid "Local port:" msgstr "" #: share/virtualbricks.template.glade:10527 #: share/virtualbricks.template.glade:10564 msgid "Tunnel client Configuration" msgstr "" #: share/virtualbricks.template.glade:10566 #: share/virtualbricks.template.glade:10603 msgid "WAIT..." msgstr "" #: share/virtualbricks.template.glade:10671 #: share/virtualbricks.template.glade:10708 msgid "Virtualbricks Settings" msgstr "" #: share/virtualbricks.template.glade:10684 #: share/virtualbricks.template.glade:10721 msgid "System Settings" msgstr "" #: share/virtualbricks.template.glade:10719 #: share/virtualbricks.template.glade:10756 msgid "Bricks directory" msgstr "" #: share/virtualbricks.template.glade:10727 #: share/virtualbricks.template.glade:10863 #: share/virtualbricks.template.glade:11012 #: share/virtualbricks.template.glade:11096 #: share/virtualbricks.template.glade:10764 #: share/virtualbricks.template.glade:10900 #: share/virtualbricks.template.glade:11049 #: share/virtualbricks.template.glade:11133 msgid "Select A Folder" msgstr "" #: share/virtualbricks.template.glade:10738 #: share/virtualbricks.template.glade:10775 msgid "X-window terminal command" msgstr "" #: share/virtualbricks.template.glade:10749 #: share/virtualbricks.template.glade:10786 msgid "X-window sudo command" msgstr "" #: share/virtualbricks.template.glade:10760 #: share/virtualbricks.template.glade:10797 msgid "your favorite x-terminal-emulator" msgstr "" #: share/virtualbricks.template.glade:10774 #: share/virtualbricks.template.glade:10811 msgid "command to perform administrative actions on your system" msgstr "" #: share/virtualbricks.template.glade:10798 #: share/virtualbricks.template.glade:10835 msgid "Enable SysTray" msgstr "" #: share/virtualbricks.template.glade:10819 #: share/virtualbricks.template.glade:10856 msgid "General" msgstr "" #: share/virtualbricks.template.glade:10855 #: share/virtualbricks.template.glade:10892 msgid "VDE binaries path" msgstr "" #: share/virtualbricks.template.glade:10861 #: share/virtualbricks.template.glade:10898 msgid "Path for vde components installed on the system" msgstr "" #: share/virtualbricks.template.glade:10876 #: share/virtualbricks.template.glade:11025 #: share/virtualbricks.template.glade:10913 #: share/virtualbricks.template.glade:11062 msgid "Status:" msgstr "" #: share/virtualbricks.template.glade:10892 #: share/virtualbricks.template.glade:10929 msgid "" "Error:\n" "invalid path for vde binaries" msgstr "" #: share/virtualbricks.template.glade:10919 #: share/virtualbricks.template.glade:10956 msgid "Use python support" msgstr "" #: share/virtualbricks.template.glade:10923 #: share/virtualbricks.template.glade:10960 msgid "Use native python support from libvdeplug" msgstr "" #: share/virtualbricks.template.glade:10932 #: share/virtualbricks.template.glade:10969 msgid "Allow female plugs on devices" msgstr "" #: share/virtualbricks.template.glade:10936 #: share/virtualbricks.template.glade:10973 msgid "Allow use of female plugs with all brick types" msgstr "" #: share/virtualbricks.template.glade:10945 #: share/virtualbricks.template.glade:10982 msgid "Network topology loop detection" msgstr "" #: share/virtualbricks.template.glade:10949 #: share/virtualbricks.template.glade:10986 msgid "" "If enabled, detect network loops when starting the bricks, and generate an " "error." msgstr "" #: share/virtualbricks.template.glade:10963 #: share/virtualbricks.template.glade:11000 msgid "Vde" msgstr "" #: share/virtualbricks.template.glade:11004 #: share/virtualbricks.template.glade:11041 msgid "Qemu/KVM binaries path" msgstr "" #: share/virtualbricks.template.glade:11010 #: share/virtualbricks.template.glade:11047 msgid "Path for qemu and kvm binaries" msgstr "" #: share/virtualbricks.template.glade:11041 #: share/virtualbricks.template.glade:11078 msgid "" "Error:\n" "invalid path for qemu/kvm binaries" msgstr "" #: share/virtualbricks.template.glade:11088 #: share/virtualbricks.template.glade:11125 msgid "Disk images repository" msgstr "" #: share/virtualbricks.template.glade:11094 #: share/virtualbricks.template.glade:11131 msgid "Directory that contains hard disk images" msgstr "" #: share/virtualbricks.template.glade:11112 #: share/virtualbricks.template.glade:11149 msgid "Disk Images" msgstr "" #: share/virtualbricks.template.glade:11140 #: share/virtualbricks.template.glade:11177 msgid "Use KVM" msgstr "" #: share/virtualbricks.template.glade:11144 #: share/virtualbricks.template.glade:11181 msgid "Allow the use of kernel-based virtual machine (recommended)" msgstr "" #: share/virtualbricks.template.glade:11154 #: share/virtualbricks.template.glade:11191 msgid "Enable KSM" msgstr "" #: share/virtualbricks.template.glade:11158 #: share/virtualbricks.template.glade:11195 msgid "Allow using the Kernel SamePage Merging support to enhance scalability" msgstr "" #: share/virtualbricks.template.glade:11173 #: share/virtualbricks.template.glade:11210 msgid "Use kqemu" msgstr "" #: share/virtualbricks.template.glade:11177 #: share/virtualbricks.template.glade:11214 msgid "Use old kqemu support" msgstr "" #: share/virtualbricks.template.glade:11191 #: share/virtualbricks.template.glade:11228 msgid "X86 optimizations" msgstr "" #: share/virtualbricks.template.glade:11208 #: share/virtualbricks.template.glade:11245 msgid "CD-Rom/DVD/Floppy Devices" msgstr "" #: share/virtualbricks.template.glade:11228 #: share/virtualbricks.template.glade:11265 msgid "" "Add your \"real\" physical drive volumes like CDR, DVD or Floppy devices " "here." msgstr "" #: share/virtualbricks.template.glade:11245 #: share/virtualbricks.template.glade:11282 msgid "Name: " msgstr "" #: share/virtualbricks.template.glade:11266 #: share/virtualbricks.template.glade:11303 msgid "Device Path: " msgstr "" #: share/virtualbricks.template.glade:11286 #: share/virtualbricks.template.glade:11323 msgid "Add" msgstr "" #: share/virtualbricks.template.glade:11330 #: share/virtualbricks.template.glade:11367 msgid "Qemu/KVM " msgstr "" #: share/virtualbricks.template.glade:11417 #: share/virtualbricks.template.glade:11454 msgid "Add Bookmark" msgstr "" #: share/virtualbricks.template.glade:11431 #: share/virtualbricks.template.glade:11468 msgid "Name:" msgstr "" #: share/virtualbricks.template.glade:11456 #: share/virtualbricks.template.glade:11493 msgid "Path:" msgstr "" #: share/virtualbricks.template.glade:11485 #: share/virtualbricks.template.glade:11522 msgid "Select A Icon" msgstr "" #: share/virtualbricks.template.glade:11495 #: share/virtualbricks.template.glade:11532 msgid "Icon for this Machine" msgstr "" #: share/virtualbricks.template.glade:11575 #: share/virtualbricks.template.glade:12064 #: share/virtualbricks.template.glade:11612 #: share/virtualbricks.template.glade:12101 msgid "show qemu volume info for selected image" msgstr "" #: share/virtualbricks.template.glade:11590 #: share/virtualbricks.template.glade:11627 msgid "remove this entry from My Machines" msgstr "" #: share/virtualbricks.template.glade:11600 #: share/virtualbricks.template.glade:11637 msgid "About: Virtualbricks" msgstr "" #: share/virtualbricks.template.glade:11656 #: share/virtualbricks.template.glade:11693 msgid "" "Virtualbricks is a GNU/Linux desktop gui for Qemu/KVM and Virtual " "Distributed Ethernet.\n" "\n" "Virtualbricks is licensed under the terms of the GPL (General Public " "Licence) Version 2.\n" "© 2011 Daniele Lacamera, Rainer Haage and the virtualbricks team on " "Launchpad. \n" "\n" "VDE - Virtual Distributed Ethernet - © 2003-2011 Renzo Davoli.\n" "QEMU - Copyright © 2005-2011 Fabrice Bellard.\n" "QEMU is a trademark of Fabrice Bellard.\n" "\n" "Icons for remote hosts are Copyleft David Vignoni - http://www.icon-king." "com/ License: LGPL\n" "\n" "If you find virtualbricks useful for your business, please consider making a " "donation." msgstr "" #: share/virtualbricks.template.glade:11713 #: share/virtualbricks.template.glade:11750 msgid "create new empty image" msgstr "" #: share/virtualbricks.template.glade:11730 #: share/virtualbricks.template.glade:11767 msgid "create new empty Disk image\n" msgstr "" #: share/virtualbricks.template.glade:11743 #: share/virtualbricks.template.glade:11780 msgid "Target Folder for the new image" msgstr "" #: share/virtualbricks.template.glade:11753 #: share/virtualbricks.template.glade:11790 msgid "Select A Directory" msgstr "" #: share/virtualbricks.template.glade:11776 #: share/virtualbricks.template.glade:11813 msgid "Name of the new image (or base image)" msgstr "" #: share/virtualbricks.template.glade:11791 #: share/virtualbricks.template.glade:11828 msgid "Enter a filename for the new image" msgstr "" #: share/virtualbricks.template.glade:11822 #: share/virtualbricks.template.glade:11859 msgid "Image format" msgstr "" #: share/virtualbricks.template.glade:11833 #: share/virtualbricks.template.glade:11870 msgid "" "Auto\n" "raw\n" "qcow\n" "qcow2\n" "cow\n" "vmdk\n" "cloop" msgstr "" #: share/virtualbricks.template.glade:11860 #: share/virtualbricks.template.glade:11897 msgid "Size" msgstr "" #: share/virtualbricks.template.glade:11875 #: share/virtualbricks.template.glade:11912 msgid "Size of the new image" msgstr "" #: share/virtualbricks.template.glade:11889 #: share/virtualbricks.template.glade:11926 msgid "" "KB\n" "MB\n" "GB" msgstr "" #: share/virtualbricks.template.glade:11949 #: share/virtualbricks.template.glade:11986 msgid "Create" msgstr "" #: share/virtualbricks.template.glade:11999 #: share/virtualbricks.template.glade:12036 msgid "message" msgstr "" #: share/virtualbricks.template.glade:12074 #: share/virtualbricks.template.glade:12111 msgid "add this image to bookmarks" msgstr "" #: share/virtualbricks.template.glade:12084 #: share/virtualbricks.template.glade:12121 msgid "Control monitor" msgstr "" #: share/virtualbricks.template.glade:12099 #: share/virtualbricks.template.glade:12136 msgid "control monitor for selected qemu job" msgstr "" #: share/virtualbricks.template.glade:12115 #: share/virtualbricks.template.glade:12152 msgid "kill emulation immediately" msgstr "" #: share/virtualbricks.template.glade:12128 #: share/virtualbricks.template.glade:12165 msgid "reset emulation" msgstr "" #: share/virtualbricks.template.glade:12149 #: share/virtualbricks.template.glade:12186 msgid "pause emulation" msgstr "" #: share/virtualbricks.template.glade:12162 #: share/virtualbricks.template.glade:12199 msgid "resume emulation" msgstr "" #: share/virtualbricks.template.glade:12190 #: share/virtualbricks.template.glade:12227 msgid "Available block devices" msgstr "" #: share/virtualbricks.template.glade:12208 #: share/virtualbricks.template.glade:12245 msgid "" "This is a list of all blockdevices used by the emulation. Rightclick an " "entry to eject. (hd volumes normally can not be ejected)" msgstr "" #: share/virtualbricks.template.glade:12222 #: share/virtualbricks.template.glade:12259 msgid "change soure of block devices" msgstr "" #: share/virtualbricks.template.glade:12238 #: share/virtualbricks.template.glade:12253 #: share/virtualbricks.template.glade:12270 #: share/virtualbricks.template.glade:12275 #: share/virtualbricks.template.glade:12290 #: share/virtualbricks.template.glade:12307 msgid "Change" msgstr "" #: share/virtualbricks.template.glade:12242 #: share/virtualbricks.template.glade:12279 msgid "change the source for qemu cdrom device to the selected image or drive" msgstr "" #: share/virtualbricks.template.glade:12257 #: share/virtualbricks.template.glade:12294 msgid "" "change the source for qemu floppy A device to the selected image or drive" msgstr "" #: share/virtualbricks.template.glade:12274 #: share/virtualbricks.template.glade:12311 msgid "" "change the source for qemu floppy B device to the selected image or drive" msgstr "" #: share/virtualbricks.template.glade:12289 #: share/virtualbricks.template.glade:12326 msgid "cdrom" msgstr "" #: share/virtualbricks.template.glade:12332 #: share/virtualbricks.template.glade:12345 #: share/virtualbricks.template.glade:12361 #: share/virtualbricks.template.glade:12369 #: share/virtualbricks.template.glade:12382 #: share/virtualbricks.template.glade:12398 msgid "None" msgstr "" #: share/virtualbricks.template.glade:12397 #: share/virtualbricks.template.glade:12434 msgid "Available host usb devices" msgstr "" #: share/virtualbricks.template.glade:12415 #: share/virtualbricks.template.glade:12452 msgid "" "All available host usb-devices. rightclick to attach a device to the virtual " "engine (you must have write access to /proc/bus/usb to attach devices)" msgstr "" #: share/virtualbricks.template.glade:12429 #: share/virtualbricks.template.glade:12466 msgid "Attached guest usb devices" msgstr "" #: share/virtualbricks.template.glade:12447 #: share/virtualbricks.template.glade:12484 msgid "" "All attached usb devices for this emulation. Rightclick to detach a device" msgstr "" #: share/virtualbricks.template.glade:12466 #: share/virtualbricks.template.glade:12503 msgid "USB" msgstr "" #: share/virtualbricks.template.glade:12478 #: share/virtualbricks.template.glade:12515 msgid "coming soon..." msgstr "" #: share/virtualbricks.template.glade:12488 #: share/virtualbricks.template.glade:12525 msgid "Emulation" msgstr "" #: share/virtualbricks.template.glade:12540 #: share/virtualbricks.template.glade:12577 msgid "open control monitor" msgstr "" #: share/virtualbricks.template.glade:12577 #: share/virtualbricks.template.glade:12614 msgid "Suspend Qemu" msgstr "" #: share/virtualbricks.template.glade:12586 #: share/virtualbricks.template.glade:12623 msgid "Send ACPI poweroff" msgstr "" #: share/virtualbricks.template.glade:12595 #: share/virtualbricks.template.glade:12632 msgid "Send ACPI hard reset" msgstr "" #: share/virtualbricks.template.glade:12651 #: share/virtualbricks.template.glade:12688 msgid "eject / unmount selected device" msgstr "" #: share/virtualbricks.template.glade:12659 #: share/virtualbricks.template.glade:12696 msgid "Setup new network card" msgstr "" #: share/virtualbricks.template.glade:12672 #: share/virtualbricks.template.glade:12709 msgid "Network Type" msgstr "" #: share/virtualbricks.template.glade:12684 #: share/virtualbricks.template.glade:12721 msgid "" "Open a TUN/TAP interface\n" "Use an already open TUN/TAP interface\n" "Open a listening TCP socket\n" "Use an already open TCP socket\n" "Connect to listening TCP socket\n" "Create shared VLAN via UDP multicast socket\n" "Use an already open UDP multicast socket" msgstr "" #: share/virtualbricks.template.glade:12719 #: share/virtualbricks.template.glade:12756 msgid "IP address: " msgstr "" #: share/virtualbricks.template.glade:12730 #: share/virtualbricks.template.glade:12767 msgid "MAC address: " msgstr "" #: share/virtualbricks.template.glade:12771 #: share/virtualbricks.template.glade:12808 msgid "VLAN:" msgstr "" #: share/virtualbricks.template.glade:12852 #: share/virtualbricks.template.glade:12889 msgid "TUN/TAP configuration script:" msgstr "" #: share/virtualbricks.template.glade:12863 #: share/virtualbricks.template.glade:12900 msgid "Name of network interface:" msgstr "" #: share/virtualbricks.template.glade:12947 #: share/virtualbricks.template.glade:12984 msgid "File descriptor: " msgstr "" #: share/virtualbricks.template.glade:13026 #: share/virtualbricks.template.glade:13063 msgid "Request" msgstr "" #: share/virtualbricks.template.glade:13054 #: share/virtualbricks.template.glade:14382 #: share/virtualbricks.template.glade:13091 #: share/virtualbricks.template.glade:14419 msgid "Are you sure?" msgstr "" #: share/virtualbricks.template.glade:13113 #: share/virtualbricks.template.glade:13150 msgid "Add redirect" msgstr "" #: share/virtualbricks.template.glade:13138 #: share/virtualbricks.template.glade:13175 msgid "TCP" msgstr "" #: share/virtualbricks.template.glade:13154 #: share/virtualbricks.template.glade:13191 msgid "UDP" msgstr "" #: share/virtualbricks.template.glade:13177 #: share/virtualbricks.template.glade:13225 #: share/virtualbricks.template.glade:13214 #: share/virtualbricks.template.glade:13262 msgid "port " msgstr "" #: share/virtualbricks.template.glade:13202 #: share/virtualbricks.template.glade:13239 msgid "to guest IP " msgstr "" #: share/virtualbricks.template.glade:13254 #: share/virtualbricks.template.glade:13291 msgid "Add redirect(s)" msgstr "" #: share/virtualbricks.template.glade:13324 #: share/virtualbricks.template.glade:13361 msgid "Mode:" msgstr "" #: share/virtualbricks.template.glade:13336 #: share/virtualbricks.template.glade:13373 msgid "DHCP" msgstr "" #: share/virtualbricks.template.glade:13349 #: share/virtualbricks.template.glade:13386 msgid "Manual" msgstr "" #: share/virtualbricks.template.glade:13387 #: share/virtualbricks.template.glade:13424 msgid "Address:" msgstr "" #: share/virtualbricks.template.glade:13393 #: share/virtualbricks.template.glade:13430 msgid "Netmask:" msgstr "" #: share/virtualbricks.template.glade:13437 #: share/virtualbricks.template.glade:13474 msgid "Advanced" msgstr "" #: share/virtualbricks.template.glade:13458 #: share/virtualbricks.template.glade:13887 #: share/virtualbricks.template.glade:14242 #: share/virtualbricks.template.glade:13495 #: share/virtualbricks.template.glade:13924 #: share/virtualbricks.template.glade:14279 msgid "Cancel" msgstr "" #: share/virtualbricks.template.glade:13471 #: share/virtualbricks.template.glade:13902 #: share/virtualbricks.template.glade:14257 #: share/virtualbricks.template.glade:13508 #: share/virtualbricks.template.glade:13939 #: share/virtualbricks.template.glade:14294 msgid "Ok" msgstr "" #: share/virtualbricks.template.glade:13537 #: share/virtualbricks.template.glade:13574 msgid "Switch" msgstr "" #: share/virtualbricks.template.glade:13576 #: share/virtualbricks.template.glade:13613 msgid "Wire" msgstr "" #: share/virtualbricks.template.glade:13615 #: share/virtualbricks.template.glade:13652 msgid "Wirefilter" msgstr "" #: share/virtualbricks.template.glade:13654 #: share/virtualbricks.template.glade:13691 msgid "Tap" msgstr "" #: share/virtualbricks.template.glade:13702 #: share/virtualbricks.template.glade:13739 msgid "Tunnel Client" msgstr "" #: share/virtualbricks.template.glade:13741 #: share/virtualbricks.template.glade:13778 msgid "Virtual Machine" msgstr "" #: share/virtualbricks.template.glade:13805 #: share/virtualbricks.template.glade:13842 msgid "Run on remote host:" msgstr "" #: share/virtualbricks.template.glade:13853 #: share/virtualbricks.template.glade:13890 msgid "Brick name:" msgstr "" #: share/virtualbricks.template.glade:13931 #: share/virtualbricks.template.glade:13968 msgid "Event type selection" msgstr "" #: share/virtualbricks.template.glade:13978 #: share/virtualbricks.template.glade:14015 msgid "Brick Start" msgstr "" #: share/virtualbricks.template.glade:14016 #: share/virtualbricks.template.glade:14053 msgid "Brick Stop" msgstr "" #: share/virtualbricks.template.glade:14055 #: share/virtualbricks.template.glade:14092 msgid "Brick Config" msgstr "" #: share/virtualbricks.template.glade:14093 #: share/virtualbricks.template.glade:14130 msgid "" "Free\n" "Shell Command" msgstr "" #: share/virtualbricks.template.glade:14141 #: share/virtualbricks.template.glade:14178 msgid "Events Collation" msgstr "" #: share/virtualbricks.template.glade:14184 #: share/virtualbricks.template.glade:14221 msgid "Event name:" msgstr "" #: share/virtualbricks.template.glade:14214 #: share/virtualbricks.template.glade:14251 msgid "10" msgstr "" #: share/virtualbricks.template.glade:14290 #: share/virtualbricks.template.glade:14745 #: share/virtualbricks.template.glade:14327 #: share/virtualbricks.template.glade:14782 msgid " " msgstr "" #: share/virtualbricks.template.glade:14301 #: share/virtualbricks.template.glade:14756 #: share/virtualbricks.template.glade:14338 #: share/virtualbricks.template.glade:14793 msgid "_Start/Stop" msgstr "" #: share/virtualbricks.template.glade:14309 #: share/virtualbricks.template.glade:14764 #: share/virtualbricks.template.glade:14346 #: share/virtualbricks.template.glade:14801 msgid "_Delete" msgstr "" #: share/virtualbricks.template.glade:14317 #: share/virtualbricks.template.glade:14772 #: share/virtualbricks.template.glade:14354 #: share/virtualbricks.template.glade:14809 msgid "Make a C_opy" msgstr "" #: share/virtualbricks.template.glade:14325 #: share/virtualbricks.template.glade:14780 #: share/virtualbricks.template.glade:14362 #: share/virtualbricks.template.glade:14817 msgid "Re_name" msgstr "" #: share/virtualbricks.template.glade:14333 #: share/virtualbricks.template.glade:14788 #: share/virtualbricks.template.glade:14370 #: share/virtualbricks.template.glade:14825 msgid "_Configure" msgstr "" #: share/virtualbricks.template.glade:14342 #: share/virtualbricks.template.glade:14379 msgid "_Resume VM" msgstr "" #: share/virtualbricks.template.glade:14350 #: share/virtualbricks.template.glade:14387 msgid "_Attach Event" msgstr "" #: share/virtualbricks.template.glade:14390 #: share/virtualbricks.template.glade:14427 msgid "Confirm Action" msgstr "" #: share/virtualbricks.template.glade:14465 #: share/virtualbricks.template.glade:14813 #: share/virtualbricks.template.glade:14502 #: share/virtualbricks.template.glade:14850 msgid "Choose a new name:" msgstr "" #: share/virtualbricks.template.glade:14532 #: share/virtualbricks.template.glade:14569 msgid "Virtualbricks: action in progress" msgstr "" #: share/virtualbricks.template.glade:14547 #: share/virtualbricks.template.glade:14584 msgid "Please wait" msgstr "" #: share/virtualbricks.template.glade:14576 #: share/virtualbricks.template.glade:14613 msgid "Select Image file" msgstr "" #: share/virtualbricks.template.glade:14637 #: share/virtualbricks.template.glade:14674 msgid "Toggle window" msgstr "" #: share/virtualbricks.template.glade:14650 #: share/virtualbricks.template.glade:14687 msgid "Close VB" msgstr "" #: share/virtualbricks.template.glade:14658 #: share/virtualbricks.template.glade:14695 msgid "Shell command actions" msgstr "" #: share/virtualbricks.template.glade:14675 #: share/virtualbricks.template.glade:14712 msgid "" "Enter shell command:\n" "(each line is an action)" msgstr "" #: share/virtualbricks.template.glade:14796 #: share/virtualbricks.template.glade:14833 msgid "New event name" msgstr "" #: share/virtualbricks.template.glade:14881 #: share/virtualbricks.template.glade:14918 msgid "Bricks to add to the event" msgstr "" #: share/virtualbricks.template.glade:14917 #: share/virtualbricks.template.glade:14954 msgid "Bricks available" msgstr "" #: share/virtualbricks.template.glade:14942 #: share/virtualbricks.template.glade:14979 msgid "" "--->\n" "<---" msgstr "" #: share/virtualbricks.template.glade:15013 #: share/virtualbricks.template.glade:15050 msgid "Bricks added" msgstr "" #: share/virtualbricks.template.glade:15077 #: share/virtualbricks.template.glade:15114 msgid "Messages" msgstr "" #: share/virtualbricks.template.glade:15203 #: share/virtualbricks.template.glade:15240 msgid "Start Event selection" msgstr "" #: share/virtualbricks.template.glade:15217 #: share/virtualbricks.template.glade:15282 #: share/virtualbricks.template.glade:15254 #: share/virtualbricks.template.glade:15319 msgid "Assign Nothing" msgstr "" #: share/virtualbricks.template.glade:15268 #: share/virtualbricks.template.glade:15305 msgid "Stop Event selection" msgstr "" #: share/virtualbricks.template.glade:15354 #: share/virtualbricks.template.glade:15391 msgid "Connect/Disconnect" msgstr "" #: share/virtualbricks.template.glade:15362 #: share/virtualbricks.template.glade:15399 msgid "Change Password" msgstr "" #: share/virtualbricks.template.glade:15370 #: share/virtualbricks.template.glade:15407 msgid "Auto-connect at startup" msgstr "" #: share/virtualbricks.template.glade:15378 #: share/virtualbricks.template.glade:15415 msgid "Delete" msgstr "" #: share/virtualbricks.template.glade:15384 #: share/virtualbricks.template.glade:15421 msgid "Authentication" msgstr "" #: share/virtualbricks.template.glade:15397 #: share/virtualbricks.template.glade:15434 msgid "Password for remote virtualbricks session:" msgstr "" #: virtualbricks/brickfactory.py:532 virtualbricks/brickfactory.py:584 #, python-format msgid "Starting: '%s'" msgstr "" #: virtualbricks/brickfactory.py:565 virtualbricks/brickfactory.py:623 #, python-format msgid "Shutting down %s" msgstr "" #: virtualbricks/brickfactory.py:576 #, python-format msgid "can not stop brick (error code: '%s')" msgstr "" #: virtualbricks/brickfactory.py:582 virtualbricks/brickfactory.py:638 #, python-format msgid "can not send SIGTERM: '%s'" msgstr "" #: virtualbricks/brickfactory.py:646 virtualbricks/brickfactory.py:709 msgid "Error: cannot start a terminal emulator" msgstr "" #: virtualbricks/brickfactory.py:651 virtualbricks/brickfactory.py:714 msgid "Error running command line" msgstr "" #: virtualbricks/brickfactory.py:658 virtualbricks/brickfactory.py:721 msgid "does not have a console" msgstr "" #: virtualbricks/brickfactory.py:669 virtualbricks/brickfactory.py:732 msgid "error opening internal console" msgstr "" #: virtualbricks/brickfactory.py:714 virtualbricks/brickfactory.py:771 #: virtualbricks/brickfactory.py:777 virtualbricks/brickfactory.py:834 msgid "running" msgstr "" #: virtualbricks/brickfactory.py:716 virtualbricks/brickfactory.py:1019 #: virtualbricks/brickfactory.py:1081 virtualbricks/brickfactory.py:1086 #: virtualbricks/brickfactory.py:1088 virtualbricks/brickfactory.py:1825 #: virtualbricks/brickfactory.py:1877 virtualbricks/brickfactory.py:779 #: virtualbricks/brickfactory.py:1082 virtualbricks/brickfactory.py:1144 #: virtualbricks/brickfactory.py:1149 virtualbricks/brickfactory.py:1151 #: virtualbricks/brickfactory.py:1888 virtualbricks/brickfactory.py:1940 msgid "disconnected" msgstr "" #: virtualbricks/brickfactory.py:718 virtualbricks/brickfactory.py:775 #: virtualbricks/brickfactory.py:781 virtualbricks/brickfactory.py:838 msgid "off" msgstr "" #: virtualbricks/brickfactory.py:773 virtualbricks/brickfactory.py:836 msgid "unconfigured" msgstr "" #: virtualbricks/brickfactory.py:798 virtualbricks/brickfactory.py:861 msgid "Error: config line must contain add OR addsh." msgstr "" #: virtualbricks/brickfactory.py:806 virtualbricks/brickfactory.py:869 #, python-format msgid "Added vb-shell command: '%s'" msgstr "" #: virtualbricks/brickfactory.py:813 virtualbricks/brickfactory.py:876 #, python-format msgid "Added host-shell command: '%s'" msgstr "" #: virtualbricks/brickfactory.py:956 virtualbricks/brickfactory.py:1019 msgid "Ports:" msgstr "" #: virtualbricks/brickfactory.py:1017 virtualbricks/brickfactory.py:1080 #, python-format msgid "plugged to %s " msgstr "" #: virtualbricks/brickfactory.py:1089 virtualbricks/brickfactory.py:1152 msgid "Configured to connect" msgstr "" #: virtualbricks/brickfactory.py:1091 virtualbricks/brickfactory.py:1154 msgid "Not yet configured." msgstr "" #: virtualbricks/brickfactory.py:1092 virtualbricks/brickfactory.py:1155 msgid "Left plug is" msgstr "" #: virtualbricks/brickfactory.py:1092 virtualbricks/brickfactory.py:1155 msgid "and right plug is" msgstr "" #: virtualbricks/brickfactory.py:1823 virtualbricks/brickfactory.py:1874 #: virtualbricks/brickfactory.py:1886 virtualbricks/brickfactory.py:1937 msgid "plugged to" msgstr "" #: virtualbricks/brickfactory.py:1824 virtualbricks/brickfactory.py:1887 msgid "listening to udp:" msgstr "" #: virtualbricks/brickfactory.py:1875 virtualbricks/brickfactory.py:1938 msgid ", connecting to udp://" msgstr "" #: virtualbricks/brickfactory.py:2146 virtualbricks/brickfactory.py:2209 msgid "command:" msgstr "" #: virtualbricks/brickfactory.py:2781 virtualbricks/brickfactory.py:2857 msgid "Engine: Bye!" msgstr "" #: virtualbricks/gui/gui.py:107 msgid "PID" msgstr "" #: virtualbricks/gui/gui.py:107 virtualbricks/gui/gui.py:109 #: virtualbricks/gui/gui.py:199 virtualbricks/gui/gui.py:221 #: virtualbricks/gui/gui.py:1138 virtualbricks/gui/gui.py:1160 #: virtualbricks/gui/gui.py:2753 virtualbricks/gui/gui.py:2775 #: virtualbricks/gui/gui.py:2726 virtualbricks/gui/gui.py:2748 #: virtualbricks/gui/gui.py:2746 virtualbricks/gui/gui.py:2768 #: virtualbricks/gui/gui.py:2754 virtualbricks/gui/gui.py:2776 #: virtualbricks/gui/gui.py:2761 virtualbricks/gui/gui.py:2783 #: virtualbricks/gui/gui.py:1140 virtualbricks/gui/gui.py:1162 #: virtualbricks/gui/gui.py:2763 virtualbricks/gui/gui.py:2785 #: virtualbricks/gui/gui.py:2765 virtualbricks/gui/gui.py:2787 #: virtualbricks/gui/gui.py:2739 msgid "Type" msgstr "" #: virtualbricks/gui/gui.py:107 virtualbricks/gui/gui.py:109 #: virtualbricks/gui/gui.py:204 virtualbricks/gui/gui.py:223 #: virtualbricks/gui/gui.py:1140 virtualbricks/gui/gui.py:1162 #: virtualbricks/gui/gui.py:2755 virtualbricks/gui/gui.py:2777 #: virtualbricks/gui/gui.py:2728 virtualbricks/gui/gui.py:2750 #: virtualbricks/gui/gui.py:2748 virtualbricks/gui/gui.py:2770 #: virtualbricks/gui/gui.py:2756 virtualbricks/gui/gui.py:2778 #: virtualbricks/gui/gui.py:2763 virtualbricks/gui/gui.py:2785 #: virtualbricks/gui/gui.py:1142 virtualbricks/gui/gui.py:1164 #: virtualbricks/gui/gui.py:2765 virtualbricks/gui/gui.py:2787 #: virtualbricks/gui/gui.py:2767 virtualbricks/gui/gui.py:2789 #: virtualbricks/gui/gui.py:2741 msgid "Name" msgstr "" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:119 #: virtualbricks/gui/gui.py:132 virtualbricks/gui/gui.py:181 #: virtualbricks/gui/gui.py:214 virtualbricks/gui/gui.py:1136 #: virtualbricks/gui/gui.py:1158 virtualbricks/gui/gui.py:2751 #: virtualbricks/gui/gui.py:2773 virtualbricks/gui/gui.py:2724 #: virtualbricks/gui/gui.py:2746 virtualbricks/gui/gui.py:2744 #: virtualbricks/gui/gui.py:2766 virtualbricks/gui/gui.py:2752 #: virtualbricks/gui/gui.py:2774 virtualbricks/gui/gui.py:2759 #: virtualbricks/gui/gui.py:2781 virtualbricks/gui/gui.py:1138 #: virtualbricks/gui/gui.py:1160 virtualbricks/gui/gui.py:2761 #: virtualbricks/gui/gui.py:2783 virtualbricks/gui/gui.py:2763 #: virtualbricks/gui/gui.py:2785 virtualbricks/gui/gui.py:2737 msgid "Icon" msgstr "" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:197 #: virtualbricks/gui/gui.py:219 msgid "Status" msgstr "" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:206 #: virtualbricks/gui/gui.py:225 virtualbricks/gui/gui.py:1142 #: virtualbricks/gui/gui.py:1164 virtualbricks/gui/gui.py:2757 #: virtualbricks/gui/gui.py:2779 virtualbricks/gui/gui.py:2730 #: virtualbricks/gui/gui.py:2752 virtualbricks/gui/gui.py:2750 #: virtualbricks/gui/gui.py:2772 virtualbricks/gui/gui.py:2758 #: virtualbricks/gui/gui.py:2780 virtualbricks/gui/gui.py:2765 #: virtualbricks/gui/gui.py:2787 virtualbricks/gui/gui.py:1144 #: virtualbricks/gui/gui.py:1166 virtualbricks/gui/gui.py:2767 #: virtualbricks/gui/gui.py:2789 virtualbricks/gui/gui.py:2769 #: virtualbricks/gui/gui.py:2791 virtualbricks/gui/gui.py:2743 msgid "Parameters" msgstr "" #: virtualbricks/gui/gui.py:115 msgid "Address" msgstr "" #: virtualbricks/gui/gui.py:115 msgid "Autoconnect" msgstr "" #: virtualbricks/gui/gui.py:332 virtualbricks/gui/gui.py:1091 #: virtualbricks/gui/gui.py:1093 msgid "Command" msgstr "" #: virtualbricks/gui/gui.py:336 virtualbricks/gui/gui.py:1095 #: virtualbricks/gui/gui.py:1097 msgid "Host shell command" msgstr "" #: virtualbricks/gui/gui.py:443 msgid "KVM is disabled from Properties" msgstr "" #: virtualbricks/gui/gui.py:729 msgid "Show Settings" msgstr "" #: virtualbricks/gui/gui.py:755 virtualbricks/gui/gui.py:792 msgid "Hide Settings" msgstr "" #: virtualbricks/gui/gui.py:1038 virtualbricks/gui/gui.py:1045 #: virtualbricks/gui/gui.py:1040 virtualbricks/gui/gui.py:1047 msgid "Cannot create brick: Invalid name." msgstr "" #: virtualbricks/gui/gui.py:1062 virtualbricks/gui/gui.py:1066 #: virtualbricks/gui/gui.py:1064 virtualbricks/gui/gui.py:1068 msgid "The name \"" msgstr "" #: virtualbricks/gui/gui.py:1062 virtualbricks/gui/gui.py:1064 msgid "\" has forbidden format." msgstr "" #: virtualbricks/gui/gui.py:1066 virtualbricks/gui/gui.py:1068 msgid "\" has been adapted to \"" msgstr "" #: virtualbricks/gui/gui.py:1070 virtualbricks/gui/gui.py:1072 msgid "An event named \"" msgstr "" #: virtualbricks/gui/gui.py:1070 virtualbricks/gui/gui.py:1072 msgid "\" already exist." msgstr "" #: virtualbricks/gui/gui.py:1174 virtualbricks/gui/gui.py:1176 msgid "Bricks to add to the event to be started" msgstr "" #: virtualbricks/gui/gui.py:1178 virtualbricks/gui/gui.py:1180 msgid "Bricks to add to the event to be stopped" msgstr "" #: virtualbricks/gui/gui.py:1182 virtualbricks/gui/gui.py:1184 msgid "Events to add to the event to be started" msgstr "" #: virtualbricks/gui/gui.py:1187 virtualbricks/gui/gui.py:1189 msgid "Cannot create event: Invalid name." msgstr "" #: virtualbricks/gui/gui.py:1311 virtualbricks/gui/gui.py:1313 msgid "Help for parameter:" msgstr "" #: virtualbricks/gui/gui.py:1316 msgid "\t\tCHANNEL BANDWIDTH\n" msgstr "" #: virtualbricks/gui/gui.py:1326 msgid "\t\tINTERFACE SPEED\n" msgstr "" #: virtualbricks/gui/gui.py:1336 msgid "\t\tDELAY\n" msgstr "" #: virtualbricks/gui/gui.py:1346 virtualbricks/gui/gui.py:1339 msgid "\t\tCHANNEL BUFFER SIZE\n" msgstr "" #: virtualbricks/gui/gui.py:1355 virtualbricks/gui/gui.py:1328 #: virtualbricks/gui/gui.py:1348 msgid "\t\tPACKET LOSS\n" msgstr "" #: virtualbricks/gui/gui.py:1363 virtualbricks/gui/gui.py:1336 #: virtualbricks/gui/gui.py:1356 msgid "\t\tPACKET DUPLICATION\n" msgstr "" #: virtualbricks/gui/gui.py:1372 virtualbricks/gui/gui.py:1345 #: virtualbricks/gui/gui.py:1365 msgid "\t\tNOISE\n" msgstr "" #: virtualbricks/gui/gui.py:1380 virtualbricks/gui/gui.py:1353 #: virtualbricks/gui/gui.py:1373 msgid "\t\tLOST BURST\n" msgstr "" #: virtualbricks/gui/gui.py:1389 virtualbricks/gui/gui.py:1362 #: virtualbricks/gui/gui.py:1382 msgid "\t\tMTU: MAXIMUM TRANSMISSION UNIT\n" msgstr "" #: virtualbricks/gui/gui.py:1613 virtualbricks/gui/gui.py:1586 #: virtualbricks/gui/gui.py:1606 virtualbricks/gui/gui.py:1614 #: virtualbricks/gui/gui.py:1621 virtualbricks/gui/gui.py:1623 #: virtualbricks/gui/gui.py:1625 virtualbricks/gui/gui.py:1599 #, python-format msgid "Cannot start '%s': not configured" msgstr "" #: virtualbricks/gui/gui.py:1618 virtualbricks/gui/gui.py:1591 #: virtualbricks/gui/gui.py:1611 virtualbricks/gui/gui.py:1619 #: virtualbricks/gui/gui.py:1626 virtualbricks/gui/gui.py:1628 #: virtualbricks/gui/gui.py:1630 virtualbricks/gui/gui.py:1604 #, python-format msgid "Cannot start '%s': not connected" msgstr "" #: virtualbricks/gui/gui.py:1624 virtualbricks/gui/gui.py:1597 #: virtualbricks/gui/gui.py:1617 virtualbricks/gui/gui.py:1625 #: virtualbricks/gui/gui.py:1632 virtualbricks/gui/gui.py:1634 #: virtualbricks/gui/gui.py:1636 virtualbricks/gui/gui.py:1610 msgid "" "Loop link detected: aborting operation. If you want to start a looped " "network, disable the check loop feature in the general settings" msgstr "" #: virtualbricks/gui/gui.py:1632 virtualbricks/gui/gui.py:1605 #: virtualbricks/gui/gui.py:1625 virtualbricks/gui/gui.py:1633 #: virtualbricks/gui/gui.py:1640 virtualbricks/gui/gui.py:1642 #: virtualbricks/gui/gui.py:1644 virtualbricks/gui/gui.py:1618 msgid "Disk used by the VM is locked by another machine" msgstr "" #: virtualbricks/gui/gui.py:1906 virtualbricks/gui/gui.py:1879 #: virtualbricks/gui/gui.py:1899 virtualbricks/gui/gui.py:1907 #: virtualbricks/gui/gui.py:1914 virtualbricks/gui/gui.py:1916 #: virtualbricks/gui/gui.py:1918 virtualbricks/gui/gui.py:1892 msgid "Choose a filename first!" msgstr "" #: virtualbricks/gui/gui.py:2095 virtualbricks/gui/gui.py:2068 #: virtualbricks/gui/gui.py:2088 virtualbricks/gui/gui.py:2096 #: virtualbricks/gui/gui.py:2103 virtualbricks/gui/gui.py:2105 #: virtualbricks/gui/gui.py:2107 virtualbricks/gui/gui.py:2081 msgid "No KVM binary found" msgstr "" #: virtualbricks/gui/gui.py:2095 virtualbricks/gui/gui.py:2098 #: virtualbricks/gui/gui.py:2068 virtualbricks/gui/gui.py:2071 #: virtualbricks/gui/gui.py:2088 virtualbricks/gui/gui.py:2091 #: virtualbricks/gui/gui.py:2096 virtualbricks/gui/gui.py:2099 #: virtualbricks/gui/gui.py:2103 virtualbricks/gui/gui.py:2106 #: virtualbricks/gui/gui.py:2105 virtualbricks/gui/gui.py:2108 #: virtualbricks/gui/gui.py:2107 virtualbricks/gui/gui.py:2110 #: virtualbricks/gui/gui.py:2081 virtualbricks/gui/gui.py:2084 msgid "Check your active configuration" msgstr "" #: virtualbricks/gui/gui.py:2095 virtualbricks/gui/gui.py:2098 #: virtualbricks/gui/gui.py:2068 virtualbricks/gui/gui.py:2071 #: virtualbricks/gui/gui.py:2088 virtualbricks/gui/gui.py:2091 #: virtualbricks/gui/gui.py:2096 virtualbricks/gui/gui.py:2099 #: virtualbricks/gui/gui.py:2103 virtualbricks/gui/gui.py:2106 #: virtualbricks/gui/gui.py:2105 virtualbricks/gui/gui.py:2108 #: virtualbricks/gui/gui.py:2107 virtualbricks/gui/gui.py:2110 #: virtualbricks/gui/gui.py:2081 virtualbricks/gui/gui.py:2084 msgid "KVM will stay disabled" msgstr "" #: virtualbricks/gui/gui.py:2098 virtualbricks/gui/gui.py:2071 #: virtualbricks/gui/gui.py:2091 virtualbricks/gui/gui.py:2099 #: virtualbricks/gui/gui.py:2106 virtualbricks/gui/gui.py:2108 #: virtualbricks/gui/gui.py:2110 virtualbricks/gui/gui.py:2084 msgid "No KVM support found on the system" msgstr "" #: virtualbricks/gui/gui.py:2106 virtualbricks/gui/gui.py:2079 #: virtualbricks/gui/gui.py:2099 virtualbricks/gui/gui.py:2107 #: virtualbricks/gui/gui.py:2114 virtualbricks/gui/gui.py:2116 #: virtualbricks/gui/gui.py:2118 virtualbricks/gui/gui.py:2092 msgid "No KSM support found on the system" msgstr "" #: virtualbricks/gui/gui.py:2106 virtualbricks/gui/gui.py:2079 #: virtualbricks/gui/gui.py:2099 virtualbricks/gui/gui.py:2107 #: virtualbricks/gui/gui.py:2114 virtualbricks/gui/gui.py:2116 #: virtualbricks/gui/gui.py:2118 virtualbricks/gui/gui.py:2092 msgid "Check your configuration" msgstr "" #: virtualbricks/gui/gui.py:2106 virtualbricks/gui/gui.py:2079 #: virtualbricks/gui/gui.py:2099 virtualbricks/gui/gui.py:2107 #: virtualbricks/gui/gui.py:2114 virtualbricks/gui/gui.py:2116 #: virtualbricks/gui/gui.py:2118 virtualbricks/gui/gui.py:2092 msgid "KSM will stay disabled" msgstr "" #: virtualbricks/gui/gui.py:2120 virtualbricks/gui/gui.py:2093 #: virtualbricks/gui/gui.py:2113 virtualbricks/gui/gui.py:2121 #: virtualbricks/gui/gui.py:2128 virtualbricks/gui/gui.py:2130 #: virtualbricks/gui/gui.py:2132 virtualbricks/gui/gui.py:2106 msgid "The brick is still running, it will be killed before being deleted!\n" msgstr "" #: virtualbricks/gui/gui.py:2122 virtualbricks/gui/gui.py:2095 #: virtualbricks/gui/gui.py:2115 virtualbricks/gui/gui.py:2123 #: virtualbricks/gui/gui.py:2130 virtualbricks/gui/gui.py:2132 #: virtualbricks/gui/gui.py:2134 virtualbricks/gui/gui.py:2108 msgid "Do you really want to delete " msgstr "" #: virtualbricks/gui/gui.py:2131 virtualbricks/gui/gui.py:2104 #: virtualbricks/gui/gui.py:2124 virtualbricks/gui/gui.py:2132 #: virtualbricks/gui/gui.py:2139 virtualbricks/gui/gui.py:2141 #: virtualbricks/gui/gui.py:2143 virtualbricks/gui/gui.py:2117 msgid "This event is in use" msgstr "" #: virtualbricks/gui/gui.py:2133 virtualbricks/gui/gui.py:2106 #: virtualbricks/gui/gui.py:2126 virtualbricks/gui/gui.py:2134 #: virtualbricks/gui/gui.py:2141 virtualbricks/gui/gui.py:2143 #: virtualbricks/gui/gui.py:2145 virtualbricks/gui/gui.py:2119 msgid "Do you really want to delete" msgstr "" #: virtualbricks/gui/gui.py:2143 virtualbricks/gui/gui.py:2116 #: virtualbricks/gui/gui.py:2136 virtualbricks/gui/gui.py:2144 #: virtualbricks/gui/gui.py:2151 virtualbricks/gui/gui.py:2153 #: virtualbricks/gui/gui.py:2155 virtualbricks/gui/gui.py:2129 msgid "Cannot rename Brick: it is in use." msgstr "" #: virtualbricks/gui/gui.py:2169 virtualbricks/gui/gui.py:2181 #: virtualbricks/gui/gui.py:2240 virtualbricks/gui/gui.py:2142 #: virtualbricks/gui/gui.py:2154 virtualbricks/gui/gui.py:2213 #: virtualbricks/gui/gui.py:2162 virtualbricks/gui/gui.py:2174 #: virtualbricks/gui/gui.py:2233 virtualbricks/gui/gui.py:2170 #: virtualbricks/gui/gui.py:2182 virtualbricks/gui/gui.py:2241 #: virtualbricks/gui/gui.py:2177 virtualbricks/gui/gui.py:2189 #: virtualbricks/gui/gui.py:2248 virtualbricks/gui/gui.py:2179 #: virtualbricks/gui/gui.py:2191 virtualbricks/gui/gui.py:2250 #: virtualbricks/gui/gui.py:2193 virtualbricks/gui/gui.py:2252 #: virtualbricks/gui/gui.py:2155 virtualbricks/gui/gui.py:2167 #: virtualbricks/gui/gui.py:2226 msgid "Invalid name!" msgstr "" #: virtualbricks/gui/gui.py:2175 virtualbricks/gui/gui.py:2148 #: virtualbricks/gui/gui.py:2168 virtualbricks/gui/gui.py:2176 #: virtualbricks/gui/gui.py:2183 virtualbricks/gui/gui.py:2185 #: virtualbricks/gui/gui.py:2187 virtualbricks/gui/gui.py:2161 msgid "Cannot rename Event: it is in use." msgstr "" #: virtualbricks/gui/gui.py:2286 virtualbricks/gui/gui.py:2295 #: virtualbricks/gui/gui.py:2325 virtualbricks/gui/gui.py:2259 #: virtualbricks/gui/gui.py:2268 virtualbricks/gui/gui.py:2298 #: virtualbricks/gui/gui.py:2279 virtualbricks/gui/gui.py:2288 #: virtualbricks/gui/gui.py:2318 virtualbricks/gui/gui.py:2287 #: virtualbricks/gui/gui.py:2296 virtualbricks/gui/gui.py:2326 #: virtualbricks/gui/gui.py:2294 virtualbricks/gui/gui.py:2303 #: virtualbricks/gui/gui.py:2333 virtualbricks/gui/gui.py:2305 #: virtualbricks/gui/gui.py:2335 virtualbricks/gui/gui.py:2307 #: virtualbricks/gui/gui.py:2337 virtualbricks/gui/gui.py:2272 #: virtualbricks/gui/gui.py:2281 virtualbricks/gui/gui.py:2311 msgid "Error" msgstr "" #: virtualbricks/gui/gui.py:2286 virtualbricks/gui/gui.py:2259 #: virtualbricks/gui/gui.py:2279 virtualbricks/gui/gui.py:2287 #: virtualbricks/gui/gui.py:2294 virtualbricks/gui/gui.py:2296 #: virtualbricks/gui/gui.py:2298 virtualbricks/gui/gui.py:2272 msgid "invalid path for qemu binaries" msgstr "" #: virtualbricks/gui/gui.py:2295 virtualbricks/gui/gui.py:2268 #: virtualbricks/gui/gui.py:2288 virtualbricks/gui/gui.py:2296 #: virtualbricks/gui/gui.py:2303 virtualbricks/gui/gui.py:2305 #: virtualbricks/gui/gui.py:2307 virtualbricks/gui/gui.py:2281 msgid "cannot find neither qemu nor kvm in this path" msgstr "" #: virtualbricks/gui/gui.py:2299 virtualbricks/gui/gui.py:2302 #: virtualbricks/gui/gui.py:2272 virtualbricks/gui/gui.py:2275 #: virtualbricks/gui/gui.py:2292 virtualbricks/gui/gui.py:2295 #: virtualbricks/gui/gui.py:2300 virtualbricks/gui/gui.py:2303 #: virtualbricks/gui/gui.py:2307 virtualbricks/gui/gui.py:2310 #: virtualbricks/gui/gui.py:2309 virtualbricks/gui/gui.py:2312 #: virtualbricks/gui/gui.py:2311 virtualbricks/gui/gui.py:2314 #: virtualbricks/gui/gui.py:2285 virtualbricks/gui/gui.py:2288 msgid "Warning" msgstr "" #: virtualbricks/gui/gui.py:2299 virtualbricks/gui/gui.py:2272 #: virtualbricks/gui/gui.py:2292 virtualbricks/gui/gui.py:2300 #: virtualbricks/gui/gui.py:2307 virtualbricks/gui/gui.py:2309 #: virtualbricks/gui/gui.py:2311 virtualbricks/gui/gui.py:2285 msgid "cannot find qemu, using kvm only\n" msgstr "" #: virtualbricks/gui/gui.py:2302 virtualbricks/gui/gui.py:2275 #: virtualbricks/gui/gui.py:2295 virtualbricks/gui/gui.py:2303 #: virtualbricks/gui/gui.py:2310 virtualbricks/gui/gui.py:2312 #: virtualbricks/gui/gui.py:2314 virtualbricks/gui/gui.py:2288 msgid "kvm not found" msgstr "" #: virtualbricks/gui/gui.py:2302 virtualbricks/gui/gui.py:2275 #: virtualbricks/gui/gui.py:2295 virtualbricks/gui/gui.py:2303 #: virtualbricks/gui/gui.py:2310 virtualbricks/gui/gui.py:2312 #: virtualbricks/gui/gui.py:2314 virtualbricks/gui/gui.py:2288 msgid "KVM support disabled" msgstr "" #: virtualbricks/gui/gui.py:2304 virtualbricks/gui/gui.py:2277 #: virtualbricks/gui/gui.py:2297 virtualbricks/gui/gui.py:2305 #: virtualbricks/gui/gui.py:2312 virtualbricks/gui/gui.py:2314 #: virtualbricks/gui/gui.py:2316 virtualbricks/gui/gui.py:2290 msgid "KVM and Qemu detected" msgstr "" #: virtualbricks/gui/gui.py:2316 virtualbricks/gui/gui.py:2289 #: virtualbricks/gui/gui.py:2309 virtualbricks/gui/gui.py:2317 #: virtualbricks/gui/gui.py:2324 virtualbricks/gui/gui.py:2326 #: virtualbricks/gui/gui.py:2328 virtualbricks/gui/gui.py:2302 msgid "additional targets supported" msgstr "" #: virtualbricks/gui/gui.py:2325 virtualbricks/gui/gui.py:2298 #: virtualbricks/gui/gui.py:2318 virtualbricks/gui/gui.py:2326 #: virtualbricks/gui/gui.py:2333 virtualbricks/gui/gui.py:2335 #: virtualbricks/gui/gui.py:2337 virtualbricks/gui/gui.py:2311 msgid "invalid path for vde binaries" msgstr "" #: virtualbricks/gui/gui.py:2327 virtualbricks/gui/gui.py:2300 #: virtualbricks/gui/gui.py:2320 virtualbricks/gui/gui.py:2328 #: virtualbricks/gui/gui.py:2335 virtualbricks/gui/gui.py:2337 #: virtualbricks/gui/gui.py:2339 virtualbricks/gui/gui.py:2313 msgid "Warning, missing modules" msgstr "" #: virtualbricks/gui/gui.py:2332 virtualbricks/gui/gui.py:2305 #: virtualbricks/gui/gui.py:2325 virtualbricks/gui/gui.py:2333 #: virtualbricks/gui/gui.py:2340 virtualbricks/gui/gui.py:2342 #: virtualbricks/gui/gui.py:2344 virtualbricks/gui/gui.py:2318 msgid "All VDE components detected" msgstr "" #: virtualbricks/gui/gui.py:2398 virtualbricks/gui/gui.py:2371 #: virtualbricks/gui/gui.py:2391 virtualbricks/gui/gui.py:2399 #: virtualbricks/gui/gui.py:2406 virtualbricks/gui/gui.py:2408 #: virtualbricks/gui/gui.py:2410 virtualbricks/gui/gui.py:2384 msgid "" "No KVM binary found. Check your active configuration. KVM will stay disabled." msgstr "" #: virtualbricks/gui/gui.py:2401 virtualbricks/gui/gui.py:2374 #: virtualbricks/gui/gui.py:2394 virtualbricks/gui/gui.py:2402 #: virtualbricks/gui/gui.py:2409 virtualbricks/gui/gui.py:2411 #: virtualbricks/gui/gui.py:2413 virtualbricks/gui/gui.py:2387 msgid "" "No KVM support found on the system. Check your active configuration. KVM " "will stay disabled." msgstr "" #: virtualbricks/gui/gui.py:2572 virtualbricks/gui/gui.py:2545 #: virtualbricks/gui/gui.py:2565 virtualbricks/gui/gui.py:2573 #: virtualbricks/gui/gui.py:2580 virtualbricks/gui/gui.py:2582 #: virtualbricks/gui/gui.py:2584 virtualbricks/gui/gui.py:2558 msgid "Suspend/Resume not supported on this disk." msgstr "" #: virtualbricks/gui/gui.py:2597 virtualbricks/gui/gui.py:2570 #: virtualbricks/gui/gui.py:2590 virtualbricks/gui/gui.py:2598 #: virtualbricks/gui/gui.py:2605 virtualbricks/gui/gui.py:2607 #: virtualbricks/gui/gui.py:2609 virtualbricks/gui/gui.py:2583 msgid "Cannot find suspend point." msgstr "" #: virtualbricks/gui/gui.py:2629 virtualbricks/gui/gui.py:2602 #: virtualbricks/gui/gui.py:2622 virtualbricks/gui/gui.py:2630 #: virtualbricks/gui/gui.py:2637 virtualbricks/gui/gui.py:2639 #: virtualbricks/gui/gui.py:2641 virtualbricks/gui/gui.py:2615 msgid "Error saving topology: Invalid image format" msgstr "" #: virtualbricks/gui/gui.py:2631 virtualbricks/gui/gui.py:2604 #: virtualbricks/gui/gui.py:2624 virtualbricks/gui/gui.py:2632 #: virtualbricks/gui/gui.py:2639 virtualbricks/gui/gui.py:2641 #: virtualbricks/gui/gui.py:2643 virtualbricks/gui/gui.py:2617 msgid "Error saving topology: Could not write file" msgstr "" #: virtualbricks/gui/gui.py:2633 virtualbricks/gui/gui.py:2606 #: virtualbricks/gui/gui.py:2626 virtualbricks/gui/gui.py:2634 #: virtualbricks/gui/gui.py:2641 virtualbricks/gui/gui.py:2643 #: virtualbricks/gui/gui.py:2645 virtualbricks/gui/gui.py:2619 msgid "Error saving topology: Unknown error" msgstr "" #: virtualbricks/gui/gui.py:2788 virtualbricks/gui/gui.py:2761 #: virtualbricks/gui/gui.py:2781 virtualbricks/gui/gui.py:2789 #: virtualbricks/gui/gui.py:2796 virtualbricks/gui/gui.py:2798 #: virtualbricks/gui/gui.py:2800 virtualbricks/gui/gui.py:2774 msgid "Virtualbricks-Events to attach to the start/stop Brick Events" msgstr "" #: virtualbricks/gui/gui.py:2794 virtualbricks/gui/gui.py:2767 #: virtualbricks/gui/gui.py:2787 virtualbricks/gui/gui.py:2795 #: virtualbricks/gui/gui.py:2802 virtualbricks/gui/gui.py:2804 #: virtualbricks/gui/gui.py:2806 virtualbricks/gui/gui.py:2780 msgid "Save current project?" msgstr "" #: virtualbricks/gui/gui.py:2797 virtualbricks/gui/gui.py:2770 #: virtualbricks/gui/gui.py:2790 virtualbricks/gui/gui.py:2798 #: virtualbricks/gui/gui.py:2805 virtualbricks/gui/gui.py:2807 #: virtualbricks/gui/gui.py:2809 virtualbricks/gui/gui.py:2783 msgid "Open a project" msgstr "" #: virtualbricks/gui/gui.py:2800 virtualbricks/gui/gui.py:2820 #: virtualbricks/gui/gui.py:2850 virtualbricks/gui/gui.py:2773 #: virtualbricks/gui/gui.py:2793 virtualbricks/gui/gui.py:2823 #: virtualbricks/gui/gui.py:2813 virtualbricks/gui/gui.py:2843 #: virtualbricks/gui/gui.py:2801 virtualbricks/gui/gui.py:2821 #: virtualbricks/gui/gui.py:2851 virtualbricks/gui/gui.py:2808 #: virtualbricks/gui/gui.py:2828 virtualbricks/gui/gui.py:2858 #: virtualbricks/gui/gui.py:2810 virtualbricks/gui/gui.py:2830 #: virtualbricks/gui/gui.py:2860 virtualbricks/gui/gui.py:2812 #: virtualbricks/gui/gui.py:2832 virtualbricks/gui/gui.py:2862 #: virtualbricks/gui/gui.py:2786 virtualbricks/gui/gui.py:2806 #: virtualbricks/gui/gui.py:2836 msgid "Virtualbricks Bricks List" msgstr "" #: virtualbricks/gui/gui.py:2804 virtualbricks/gui/gui.py:2824 #: virtualbricks/gui/gui.py:2854 virtualbricks/gui/gui.py:2777 #: virtualbricks/gui/gui.py:2797 virtualbricks/gui/gui.py:2827 #: virtualbricks/gui/gui.py:2817 virtualbricks/gui/gui.py:2847 #: virtualbricks/gui/gui.py:2805 virtualbricks/gui/gui.py:2825 #: virtualbricks/gui/gui.py:2855 virtualbricks/gui/gui.py:2812 #: virtualbricks/gui/gui.py:2832 virtualbricks/gui/gui.py:2862 #: virtualbricks/gui/gui.py:2814 virtualbricks/gui/gui.py:2834 #: virtualbricks/gui/gui.py:2864 virtualbricks/gui/gui.py:2816 #: virtualbricks/gui/gui.py:2836 virtualbricks/gui/gui.py:2866 #: virtualbricks/gui/gui.py:2790 virtualbricks/gui/gui.py:2810 #: virtualbricks/gui/gui.py:2840 msgid "All files" msgstr "" #: virtualbricks/gui/gui.py:2816 virtualbricks/gui/gui.py:2789 #: virtualbricks/gui/gui.py:2809 virtualbricks/gui/gui.py:2817 #: virtualbricks/gui/gui.py:2824 virtualbricks/gui/gui.py:2826 #: virtualbricks/gui/gui.py:2828 virtualbricks/gui/gui.py:2802 msgid "Save as..." msgstr "" #: virtualbricks/gui/gui.py:2846 virtualbricks/gui/gui.py:2819 #: virtualbricks/gui/gui.py:2839 virtualbricks/gui/gui.py:2847 #: virtualbricks/gui/gui.py:2854 virtualbricks/gui/gui.py:2856 #: virtualbricks/gui/gui.py:2858 virtualbricks/gui/gui.py:2832 msgid "New project" msgstr "" #: virtualbricks/settings.py:86 #, python-format msgid "Configuration loaded ('%s')" msgstr "" #: virtualbricks/settings.py:88 msgid "Cannot read config file " msgstr "" #: virtualbricks/settings.py:90 msgid "Default configuration loaded" msgstr "" #: virtualbricks/settings.py:94 #, python-format msgid "Default configuration saved ('%s')" msgstr "" #: virtualbricks/settings.py:97 msgid "Cannot save default configuration" msgstr "" #: virtualbricks/gui/gui.py:1316 #, python-format msgid "" "\t\tCHANNEL BANDWIDTH\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1326 virtualbricks/gui/gui.py:1319 #, python-format msgid "" "\t\tINTERFACE SPEED\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1336 virtualbricks/gui/gui.py:1322 #, python-format msgid "" "\t\tDELAY\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1325 #, python-format msgid "" "\t\tCHANNEL BUFFER SIZE\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1316 #, python-format msgid "" "\t\tCHANNEL BANDWIDTH\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10\\% for a base value " "of 100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98\\% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1319 #, python-format msgid "" "\t\tINTERFACE SPEED\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10\\% for a base value " "of 100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98\\% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1329 #, python-format msgid "" "\t\tDELAY\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10\\% for a base value " "of 100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98\\% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1316 #, python-format msgid "" "\t\tCHANNEL BANDWIDTH\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1319 virtualbricks/gui/gui.py:1320 #: virtualbricks/gui/gui.py:1327 #, python-format msgid "" "\t\tINTERFACE SPEED\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1329 virtualbricks/gui/gui.py:1331 #: virtualbricks/gui/gui.py:1338 #, python-format msgid "" "\t\tDELAY\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1342 virtualbricks/gui/gui.py:1349 #, python-format msgid "" "\t\tCHANNEL BUFFER SIZE\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1352 virtualbricks/gui/gui.py:1359 #, python-format msgid "" "\t\tPACKET LOSS\n" "Percentage of loss as a floating point number.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1361 virtualbricks/gui/gui.py:1368 #, python-format msgid "" "\t\tPACKET DUPLICATION\n" "Percentage of dup packet. Do not use dup factor 100%% because it means that " "each packet is sent infinite times.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1371 virtualbricks/gui/gui.py:1378 #, python-format msgid "" "\t\tNOISE\n" "Number of bits damaged/one megabyte (megabit).\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1380 virtualbricks/gui/gui.py:1387 #, python-format msgid "" "\t\tLOST BURST\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1390 virtualbricks/gui/gui.py:1397 msgid "" "\t\tMTU: MAXIMUM TRANSMISSION UNIT\n" "Packets longer than specified size are discarded." msgstr "" #: share/virtualbricks.template.glade:1833 msgid "Number of CPUs:" msgstr "" #: virtualbricks/brickfactory.py:641 msgid "can not stop brick error code:" msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1329 #, python-format msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1340 #, python-format msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1351 #, python-format msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1361 virtualbricks/gui/gui.py:1363 #, python-format msgid "" "\t\t\tPACKET LOSS\n" "\n" "Percentage of loss as a floating point number.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1370 virtualbricks/gui/gui.py:1372 msgid "" "\t\t\tPACKET DUPLICATION\n" "\n" "Percentage of dup packet. Do not use dup factor 100% because it means that " "each packet is sent infinite times.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1380 virtualbricks/gui/gui.py:1382 #, python-format msgid "" "\t\t\tNOISE\n" "\n" "Number of bits damaged/one megabyte (megabit).\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1389 virtualbricks/gui/gui.py:1391 #, python-format msgid "" "\t\t\tLOST BURST\n" "\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1399 virtualbricks/gui/gui.py:1401 #: virtualbricks/gui/gui.py:1382 virtualbricks/gui/gui.py:1375 msgid "" "\t\t\tMTU: MAXIMUM TRANSMISSION UNIT\n" "\n" "Packets longer than specified size are discarded." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1329 virtualbricks/gui/gui.py:1331 #, python-format msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1340 virtualbricks/gui/gui.py:1342 #, python-format msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1351 virtualbricks/gui/gui.py:1353 #, python-format msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10\\% for a base value " "of 100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98\\% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10\\u0025 for a base " "value of 100 means the final value goes from 90 to 110. The distribution can " "be Uniform or Gaussian normal (more than 98\\% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1317 #, python-format msgid "" "Jitter 10% for a base value of 100 means the final value goes from 90 to " "110. The distribution can be Uniform or Gaussian normal (more than 98% of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1323 virtualbricks/gui/gui.py:1325 msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1317 #, python-format msgid "" "Jitter 10%% for a base value of 100 means the final value goes from 90 to " "110. The distribution can be Uniform or Gaussian normal (more than 98%% of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "Jitter 10 percent for a base value of 100 means the final value goes from 90 " "to 110. The distribution can be Uniform or Gaussian normal (more than 98% of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1333 msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1341 msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1349 msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1356 msgid "" "\t\t\tPACKET LOSS\n" "\n" "Percentage of loss as a floating point number.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1362 msgid "" "\t\t\tPACKET DUPLICATION\n" "\n" "Percentage of dup packet. Do not use dup factor 100% because it means that " "each packet is sent infinite times.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1369 msgid "" "\t\t\tNOISE\n" "\n" "Number of bits damaged/one megabyte (megabit).\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1375 msgid "" "\t\t\tLOST BURST\n" "\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "Jitter 10 %% percent for a base value of 100 means the final value goes from " "90 to 110. The distribution can be Uniform or Gaussian normal (more than " "98% of the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 msgid "" "Jitter 10 % percent for a base value of 100 means the final value goes from " "90 to 110. The distribution can be Uniform or Gaussian normal (more than 98% " "of the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "Jitter 10 % for a base value of 100 means the final value goes from 90 to " "110. The distribution can be Uniform or Gaussian normal (more than 98 % of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "Jitter 10 %% for a base value of 100 means the final value goes from 90 to " "110. The distribution can be Uniform or Gaussian normal (more than 98 %% of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\n" "Jitter is the variation from the base value. Jitter 10 percent for a base " "value of 100 means the final value goes from 90 to 110. The distribution can " "be Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1326 msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path)." msgstr "" #: virtualbricks/gui/gui.py:1333 msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth." msgstr "" #: virtualbricks/gui/gui.py:1340 msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay." msgstr "" #: virtualbricks/gui/gui.py:1347 msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded." msgstr "" #: virtualbricks/gui/gui.py:1353 msgid "" "\t\t\tPACKET LOSS\n" "\n" "Percentage of loss as a floating point number." msgstr "" #: virtualbricks/gui/gui.py:1358 msgid "" "\t\t\tPACKET DUPLICATION\n" "\n" "Percentage of dup packet. Do not use dup factor 100% because it means that " "each packet is sent infinite times." msgstr "" #: virtualbricks/gui/gui.py:1364 msgid "" "\t\t\tNOISE\n" "\n" "Number of bits damaged/one megabyte (megabit)." msgstr "" #: virtualbricks/gui/gui.py:1369 msgid "" "\t\t\tLOST BURST\n" "\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts." msgstr "" virtualbricks-1.0.2/locale/virtualbricks/it.po000066400000000000000000003316741262207653100215170ustar00rootroot00000000000000# 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 , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: virtualbricks 0.4\n" "Report-Msgid-Bugs-To: qemulator-list@createweb.de\n" "POT-Creation-Date: 2011-06-01 22:47+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: share/virtualbricks.template.glade:10 msgid "Virtualbricks" msgstr "Virtualbricks" #: share/virtualbricks.template.glade:27 msgid "_File" msgstr "_File" #: share/virtualbricks.template.glade:33 msgid "_Open Project" msgstr "_Apri Progetto" #: share/virtualbricks.template.glade:48 msgid "_Recent Projects..." msgstr "Progetti _Recenti" #: share/virtualbricks.template.glade:68 msgid "Restart with _empty project" msgstr "Avvia un progetto _vuoto" #: share/virtualbricks.template.glade:83 msgid "_Import bricks" msgstr "_Importa Mattoni" #: share/virtualbricks.template.glade:98 msgid "_Save project as..." msgstr "_Salva progetto come..." #: share/virtualbricks.template.glade:132 msgid "_Settings" msgstr "_Impostazioni" #: share/virtualbricks.template.glade:140 msgid "configure Virtualbricks" msgstr "configura Virtualbricks" #: share/virtualbricks.template.glade:150 msgid "auto show empty settings" msgstr "" "mostra automaticamente\n" "impostazioni vuote" #: share/virtualbricks.template.glade:159 msgid "auto hide stored settings" msgstr "" "nascondi automaticamente\n" "impostazioni raccolte" #: share/virtualbricks.template.glade:171 msgid "_View" msgstr "_Vista" #: share/virtualbricks.template.glade:179 msgid "_Messages" msgstr "_Messaggi" #: share/virtualbricks.template.glade:191 msgid "_Image creation" msgstr "Creazione _Immagine" #: share/virtualbricks.template.glade:198 msgid "Not implemented yet" msgstr "Ancora non implementato" #: share/virtualbricks.template.glade:199 msgid "_Create new image" msgstr "_Crea nuova immagine" #: share/virtualbricks.template.glade:211 msgid "_Help" msgstr "_Aiuto" #: share/virtualbricks.template.glade:218 msgid "About Virtualbricks and QEMU" msgstr "Informazioni su Virtualbricks e QEMU" #: share/virtualbricks.template.glade:219 msgid "_About" msgstr "_Informazioni su" #: share/virtualbricks.template.glade:271 msgid "Bricks:" msgstr "Mattoni:" #: share/virtualbricks.template.glade:298 msgid "New Brick" msgstr "Nuovo Mattone" #: share/virtualbricks.template.glade:320 msgid "Start All Bricks" msgstr "Avvia Tutti i Mattoni" #: share/virtualbricks.template.glade:334 msgid "Stop All Bricks" msgstr "Ferma Tutti i Mattoni" #: share/virtualbricks.template.glade:361 msgid "" "You can use drag and drop to connect bricks and double click to start/stop " "them." msgstr "" "Si può usare il drag and drop per connettere i mattoni e il doppio click per " "avviarli/fermarli." #: share/virtualbricks.template.glade:378 virtualbricks/gui/gui.py:115 msgid "Bricks" msgstr "Mattoni" #: share/virtualbricks.template.glade:396 msgid "New Event" msgstr "Nuovo Evento" #: share/virtualbricks.template.glade:418 msgid "Start All Events" msgstr "Avvia Tutti gli Eventi" #: share/virtualbricks.template.glade:432 msgid "Stop All Events" msgstr "Ferma Tutti gli Eventi" #: share/virtualbricks.template.glade:459 msgid "" "You can use drag and drop to add an event to events collation and double " "click to start/stop them." msgstr "" "Si può usare il drag and drop per aggiungere un evento ad una collezione di " "eventi e il doppio click per per avviarli/fermarli." #: share/virtualbricks.template.glade:477 msgid "Events" msgstr "Eventi" #: share/virtualbricks.template.glade:494 msgid "" "Click to select an enty for use or edit its configuration, rightclick for " "more." msgstr "" "Clicca per selezionare un elemento da usare o configurare, tasto destro per " "altro." #: share/virtualbricks.template.glade:508 msgid "Running" msgstr "In esecuzione" #: share/virtualbricks.template.glade:526 msgid "Add host:" msgstr "" #: share/virtualbricks.template.glade:601 msgid "Remote Sessions" msgstr "Sessione Remota" #: share/virtualbricks.template.glade:637 msgid "Export as Image" msgstr "Esporta come Immagine" #: share/virtualbricks.template.glade:653 msgid "Expand Horizontally" msgstr "Espandi Orizzontalmente" #: share/virtualbricks.template.glade:668 msgid "Expand Vertically" msgstr "Espandi Verticalmente" #: share/virtualbricks.template.glade:725 msgid "Topology" msgstr "Topologia" #: share/virtualbricks.template.glade:744 msgid "Show/hide configuration panel for selected boot image" msgstr "" "Mostra/nascondi pannello di configurazione per\n" "l'immagine di boot selezionata" #: share/virtualbricks.template.glade:769 msgid "Show settings" msgstr "Mostra impostazioni" #: share/virtualbricks.template.glade:839 msgid "boot as device" msgstr "fai boot dal dispositivo" #: share/virtualbricks.template.glade:871 msgid "Snapshot mode" msgstr "Modalità Snapshot" #: share/virtualbricks.template.glade:876 msgid "write to temporary files instead of disk image files" msgstr "scrivi su un file temporaneo invece delle immagini disco" #: share/virtualbricks.template.glade:902 msgid "boot options" msgstr "opzioni di boot" #: share/virtualbricks.template.glade:931 msgid "use image as cdrom" msgstr "usa immagine come cdrom" #: share/virtualbricks.template.glade:936 msgid "use one of the image files in the default folder as cdrom device" msgstr "" "usa uno di questi file immagine nella cartella di default come dispositivo " "cdrom" #: share/virtualbricks.template.glade:951 msgid "mount cdrom" msgstr "monta cdrom" #: share/virtualbricks.template.glade:956 msgid "mount local cdrom Drive" msgstr "monta dispositovo cdrom locale" #: share/virtualbricks.template.glade:970 msgid "no cdrom" msgstr "nessun cdrom" #: share/virtualbricks.template.glade:975 msgid "don´t use any cdrom device" msgstr "non usare nessun dispositivo cdrom" #: share/virtualbricks.template.glade:990 msgid "/dev/cdrom\n" msgstr "/dev/cdrom\n" #: share/virtualbricks.template.glade:1062 msgid "cdrom device" msgstr "dispositivo cdrom" #: share/virtualbricks.template.glade:1110 msgid "Select images for Qemu volumes" msgstr "Seleziona immagini per supporti Qemu" #: share/virtualbricks.template.glade:1134 #: share/virtualbricks.template.glade:12317 #: share/virtualbricks.template.glade:12354 msgid "fdb" msgstr "fdb" #: share/virtualbricks.template.glade:1148 #: share/virtualbricks.template.glade:12302 #: share/virtualbricks.template.glade:12339 msgid "fda" msgstr "fda" #: share/virtualbricks.template.glade:1162 msgid "hdd" msgstr "hdd" #: share/virtualbricks.template.glade:1176 msgid "hdc" msgstr "hdc" #: share/virtualbricks.template.glade:1190 msgid "hdb" msgstr "hdb" #: share/virtualbricks.template.glade:1204 msgid "hda" msgstr "hda" #: share/virtualbricks.template.glade:1315 msgid "mtdblock" msgstr "mtdblock" #: share/virtualbricks.template.glade:1360 #: share/virtualbricks.template.glade:1401 #: share/virtualbricks.template.glade:1444 #: share/virtualbricks.template.glade:1487 #: share/virtualbricks.template.glade:1530 #: share/virtualbricks.template.glade:1573 #: share/virtualbricks.template.glade:1616 msgid "Private COW" msgstr "COW Privato" #: share/virtualbricks.template.glade:1648 msgid "additional media" msgstr "supporti aggiuntivi" #: share/virtualbricks.template.glade:1685 #: share/virtualbricks.template.glade:12383 #: share/virtualbricks.template.glade:12420 msgid "Drives" msgstr "Drives" #: share/virtualbricks.template.glade:1723 msgid "Architecture: " msgstr "Architettura:" #: share/virtualbricks.template.glade:1752 #: share/virtualbricks.template.glade:1802 msgid "\n" msgstr "\n" #: share/virtualbricks.template.glade:1764 msgid "CPU Type" msgstr "Tipo di CPU" #: share/virtualbricks.template.glade:1776 msgid "" "\n" "\n" msgstr "" "\n" "\n" #: share/virtualbricks.template.glade:1790 msgid "Machine type" msgstr "Tipo di macchina" #: share/virtualbricks.template.glade:1813 #: share/virtualbricks.template.glade:1816 msgid "KVM" msgstr "KVM" #: share/virtualbricks.template.glade:1833 #: share/virtualbricks.template.glade:1870 msgid "System and machine" msgstr "Sistema e macchina" #: share/virtualbricks.template.glade:1891 #: share/virtualbricks.template.glade:1928 msgid "disable graphical output" msgstr "disabilita output grafico" #: share/virtualbricks.template.glade:1896 #: share/virtualbricks.template.glade:1933 msgid "disable graphical output and redirect serial I/Os to console" msgstr "disabilita output grafico e ridirigi I/O seriale alla console" #: share/virtualbricks.template.glade:1923 #: share/virtualbricks.template.glade:1960 msgid "Use VGA instead of Default" msgstr "Usa VGA invece del Default" #: share/virtualbricks.template.glade:1928 #: share/virtualbricks.template.glade:1965 msgid "" "simulate a standard VGA card with VESA Bochs Extensions (default is CL-" "GD5446 PCI VGA)" msgstr "" "simula una VGA standard con l'estensione VESA Bochs (il default è CL-GD5446 " "PCI VGA)" #: share/virtualbricks.template.glade:1943 #: share/virtualbricks.template.glade:1980 msgid "Start in vncserver" msgstr "Avvia in vncserver" #: share/virtualbricks.template.glade:1948 #: share/virtualbricks.template.glade:1985 msgid "start emulation in a VNC server on display" msgstr "avvia emulazione in un server VNC nel display" #: share/virtualbricks.template.glade:1962 #: share/virtualbricks.template.glade:1999 msgid "on Display: " msgstr "sul Display:" #: share/virtualbricks.template.glade:1974 #: share/virtualbricks.template.glade:2011 msgid "select Dsiplay for VNC server" msgstr "seleziona il display per il server VNC" #: share/virtualbricks.template.glade:1992 #: share/virtualbricks.template.glade:2029 msgid "SDL" msgstr "SDL" #: share/virtualbricks.template.glade:2004 #: share/virtualbricks.template.glade:2041 msgid "Portrait" msgstr "Verticale" #: share/virtualbricks.template.glade:2026 #: share/virtualbricks.template.glade:2063 msgid "Display Options" msgstr "Visualizza Opzioni" #: share/virtualbricks.template.glade:2055 #: share/virtualbricks.template.glade:2092 msgid "enable usb" msgstr "abilita usb" #: share/virtualbricks.template.glade:2060 #: share/virtualbricks.template.glade:2097 msgid "enable access to usb" msgstr "abilita l'accesso all'usb" #: share/virtualbricks.template.glade:2091 #: share/virtualbricks.template.glade:2128 msgid "USB settings" msgstr "Impostazioni USB" #: share/virtualbricks.template.glade:2128 #: share/virtualbricks.template.glade:2165 msgid "Set realtime clock to local time" msgstr "Imposta l'orologio come l'ora locale" #: share/virtualbricks.template.glade:2133 #: share/virtualbricks.template.glade:2170 msgid "set the real time clock to local time [default=utc]" msgstr "imposta l'orologio come l'ora locale [default=utc]" #: share/virtualbricks.template.glade:2145 #: share/virtualbricks.template.glade:2182 msgid "Guest time drift compensation (TDF)" msgstr "" "Compensazione dello slittamento\n" "tempo Guest (TDF)" #: share/virtualbricks.template.glade:2163 #: share/virtualbricks.template.glade:2200 msgid "Keyboard: " msgstr "Tastiera:" #: share/virtualbricks.template.glade:2193 #: share/virtualbricks.template.glade:2230 msgid "Serial" msgstr "Seriale" #: share/virtualbricks.template.glade:2210 #: share/virtualbricks.template.glade:2247 msgid "Extra Settings" msgstr "Impostazioni Extra" #: share/virtualbricks.template.glade:2256 #: share/virtualbricks.template.glade:2293 msgid "select emulated Soundcard " msgstr "seleziona Scheda audio emulata" #: share/virtualbricks.template.glade:2284 #: share/virtualbricks.template.glade:2626 #: share/virtualbricks.template.glade:3463 #: share/virtualbricks.template.glade:3484 #: share/virtualbricks.template.glade:10116 #: share/virtualbricks.template.glade:10137 #: share/virtualbricks.template.glade:10289 #: share/virtualbricks.template.glade:10508 #: share/virtualbricks.template.glade:2321 #: share/virtualbricks.template.glade:2663 #: share/virtualbricks.template.glade:3500 #: share/virtualbricks.template.glade:3521 #: share/virtualbricks.template.glade:10153 #: share/virtualbricks.template.glade:10174 #: share/virtualbricks.template.glade:10326 #: share/virtualbricks.template.glade:10545 msgid " \n" msgstr " \n" #: share/virtualbricks.template.glade:2300 #: share/virtualbricks.template.glade:2337 msgid "Audio Device Settings" msgstr "Impostazioni dispositivo audio" #: share/virtualbricks.template.glade:2329 #: share/virtualbricks.template.glade:2366 msgid "Used RAM:" msgstr "RAM usata:" #: share/virtualbricks.template.glade:2355 #: share/virtualbricks.template.glade:2402 #: share/virtualbricks.template.glade:2392 #: share/virtualbricks.template.glade:2439 msgid " MB" msgstr " MB" #: share/virtualbricks.template.glade:2373 #: share/virtualbricks.template.glade:2410 msgid "KVM Shadow Memory: " msgstr "KVM Shadow Memory: " #: share/virtualbricks.template.glade:2420 #: share/virtualbricks.template.glade:2457 msgid "Memory Settings" msgstr "Impostazioni memoria" #: share/virtualbricks.template.glade:2481 #: share/virtualbricks.template.glade:2518 msgid "System" msgstr "Sistema" #: share/virtualbricks.template.glade:2507 #: share/virtualbricks.template.glade:2544 msgid "Disable networking" msgstr "Disabilita rete" #: share/virtualbricks.template.glade:2534 #: share/virtualbricks.template.glade:2571 msgid "No Network" msgstr "Nessuna rete" #: share/virtualbricks.template.glade:2561 #: share/virtualbricks.template.glade:2598 msgid "Start with usermode network (default)" msgstr "Avvia con la rete usermode (default)" #: share/virtualbricks.template.glade:2587 #: share/virtualbricks.template.glade:2624 msgid "Connect to network" msgstr "Connetti alla rete" #: share/virtualbricks.template.glade:2613 #: share/virtualbricks.template.glade:9901 #: share/virtualbricks.template.glade:2650 #: share/virtualbricks.template.glade:9938 msgid "Connect to:" msgstr "Connetti a:" #: share/virtualbricks.template.glade:2637 #: share/virtualbricks.template.glade:2674 msgid "Virtual ethernet model:" msgstr "Modello virtual ethernet:" #: share/virtualbricks.template.glade:2648 #: share/virtualbricks.template.glade:2685 msgid "" "\n" "rtl8139\n" "e1000\n" "virtio\n" "i82551\n" "i82557b\n" "i82559er\n" "ne2k_pci\n" "pcnet\n" "ne2k_isa\n" msgstr "" "\n" "rtl8139\n" "e1000\n" "virtio\n" "i82551\n" "i82557b\n" "i82559er\n" "ne2k_pci\n" "pcnet\n" "ne2k_isa\n" #: share/virtualbricks.template.glade:2668 #: share/virtualbricks.template.glade:2705 msgid "Mac address:" msgstr "Indirizzo Mac:" #: share/virtualbricks.template.glade:2689 #: share/virtualbricks.template.glade:2726 msgid "Randomize" msgstr "Randomizza" #: share/virtualbricks.template.glade:2719 #: share/virtualbricks.template.glade:2756 msgid "Set up a new network card" msgstr "Imposta una nuova scheda di rete" #: share/virtualbricks.template.glade:2746 #: share/virtualbricks.template.glade:2783 msgid "Add Network card" msgstr "Aggiungi una scheda di rete" #: share/virtualbricks.template.glade:2772 #: share/virtualbricks.template.glade:2809 msgid "Edit selected network card or redirection" msgstr "Modifica la scheda di rete selezionata o la redirezione" #: share/virtualbricks.template.glade:2799 #: share/virtualbricks.template.glade:2836 msgid "Edit" msgstr "Modifica" #: share/virtualbricks.template.glade:2825 #: share/virtualbricks.template.glade:2862 msgid "Remove selected network card or redirection" msgstr "Rimuovi la scheda di rete selezionata o la redirezione" #: share/virtualbricks.template.glade:2853 #: share/virtualbricks.template.glade:11302 #: share/virtualbricks.template.glade:2890 #: share/virtualbricks.template.glade:11339 msgid "Remove" msgstr "Rimuovi" #: share/virtualbricks.template.glade:2913 #: share/virtualbricks.template.glade:2950 msgid "SMB share" msgstr "Condivisione SMB" #: share/virtualbricks.template.glade:2938 #: share/virtualbricks.template.glade:2975 msgid "SMB Share" msgstr "Condivisione SMB" #: share/virtualbricks.template.glade:2994 #: share/virtualbricks.template.glade:3031 msgid "Network cards" msgstr "Schede di rete" #: share/virtualbricks.template.glade:3027 #: share/virtualbricks.template.glade:3064 msgid "Network" msgstr "Rete" #: share/virtualbricks.template.glade:3055 #: share/virtualbricks.template.glade:3092 msgid "Use a custom kernel" msgstr "Usa kernel personalizzato" #: share/virtualbricks.template.glade:3068 #: share/virtualbricks.template.glade:3105 msgid "Specify initial ramdisk" msgstr "Specifica ramdisk iniziale" #: share/virtualbricks.template.glade:3099 #: share/virtualbricks.template.glade:3136 msgid "Parameters to append to command line:" msgstr "Parametri da appendere alla riga di comando:" #: share/virtualbricks.template.glade:3211 #: share/virtualbricks.template.glade:3248 msgid "Enable kernel debugging" msgstr "Abilita il debugging del kernel" #: share/virtualbricks.template.glade:3226 #: share/virtualbricks.template.glade:3263 msgid "GNU debugger TCP port:" msgstr "Porta TCP debugger GNU:" #: share/virtualbricks.template.glade:3259 #: share/virtualbricks.template.glade:3296 msgid "Booting Linux" msgstr "Booting Linux" #: share/virtualbricks.template.glade:3286 #: share/virtualbricks.template.glade:3323 msgid "Customize Linux Boot" msgstr "Personalizza Linux Boot" #: share/virtualbricks.template.glade:3379 #: share/virtualbricks.template.glade:3416 msgid "Virtual Machine Icon" msgstr "Icona Macchina Virtuale" #: share/virtualbricks.template.glade:3419 #: share/virtualbricks.template.glade:3456 msgid "Others" msgstr "Altri" #: share/virtualbricks.template.glade:3473 #: share/virtualbricks.template.glade:10126 #: share/virtualbricks.template.glade:3510 #: share/virtualbricks.template.glade:10163 msgid "<=== connect ===>" msgstr "<=== connetti ===>" #: share/virtualbricks.template.glade:3502 #: share/virtualbricks.template.glade:3539 msgid "Plugs" msgstr "Plugs" #: share/virtualbricks.template.glade:3532 #: share/virtualbricks.template.glade:4256 #: share/virtualbricks.template.glade:5024 #: share/virtualbricks.template.glade:5745 #: share/virtualbricks.template.glade:6488 #: share/virtualbricks.template.glade:7209 #: share/virtualbricks.template.glade:7950 #: share/virtualbricks.template.glade:8675 #: share/virtualbricks.template.glade:9407 #: share/virtualbricks.template.glade:3569 #: share/virtualbricks.template.glade:4293 #: share/virtualbricks.template.glade:5061 #: share/virtualbricks.template.glade:5782 #: share/virtualbricks.template.glade:6525 #: share/virtualbricks.template.glade:7246 #: share/virtualbricks.template.glade:7987 #: share/virtualbricks.template.glade:8712 #: share/virtualbricks.template.glade:9444 msgid "Symmetrical" msgstr "Simmetrico" #: share/virtualbricks.template.glade:3550 #: share/virtualbricks.template.glade:5042 #: share/virtualbricks.template.glade:5763 #: share/virtualbricks.template.glade:6506 #: share/virtualbricks.template.glade:7227 #: share/virtualbricks.template.glade:7968 #: share/virtualbricks.template.glade:8693 #: share/virtualbricks.template.glade:9425 #: share/virtualbricks.template.glade:3587 #: share/virtualbricks.template.glade:5079 #: share/virtualbricks.template.glade:5800 #: share/virtualbricks.template.glade:6543 #: share/virtualbricks.template.glade:7264 #: share/virtualbricks.template.glade:8005 #: share/virtualbricks.template.glade:8730 #: share/virtualbricks.template.glade:9462 msgid "Multiplier" msgstr "Moltiplic." #: share/virtualbricks.template.glade:3579 #: share/virtualbricks.template.glade:4303 #: share/virtualbricks.template.glade:5069 #: share/virtualbricks.template.glade:5792 #: share/virtualbricks.template.glade:6533 #: share/virtualbricks.template.glade:7254 #: share/virtualbricks.template.glade:7998 #: share/virtualbricks.template.glade:8720 #: share/virtualbricks.template.glade:9454 #: share/virtualbricks.template.glade:3616 #: share/virtualbricks.template.glade:4340 #: share/virtualbricks.template.glade:5106 #: share/virtualbricks.template.glade:5829 #: share/virtualbricks.template.glade:6570 #: share/virtualbricks.template.glade:7291 #: share/virtualbricks.template.glade:8035 #: share/virtualbricks.template.glade:8757 #: share/virtualbricks.template.glade:9491 msgid "UM" msgstr "UM" #: share/virtualbricks.template.glade:3605 #: share/virtualbricks.template.glade:4329 #: share/virtualbricks.template.glade:5094 #: share/virtualbricks.template.glade:5817 #: share/virtualbricks.template.glade:6558 #: share/virtualbricks.template.glade:7279 #: share/virtualbricks.template.glade:8024 #: share/virtualbricks.template.glade:8745 #: share/virtualbricks.template.glade:9480 #: share/virtualbricks.template.glade:3642 #: share/virtualbricks.template.glade:4366 #: share/virtualbricks.template.glade:5131 #: share/virtualbricks.template.glade:5854 #: share/virtualbricks.template.glade:6595 #: share/virtualbricks.template.glade:7316 #: share/virtualbricks.template.glade:8061 #: share/virtualbricks.template.glade:8782 #: share/virtualbricks.template.glade:9517 msgid "General parameters" msgstr "Parametri generali" #: share/virtualbricks.template.glade:3632 #: share/virtualbricks.template.glade:3819 #: share/virtualbricks.template.glade:4015 #: share/virtualbricks.template.glade:4356 #: share/virtualbricks.template.glade:4543 #: share/virtualbricks.template.glade:4739 #: share/virtualbricks.template.glade:5121 #: share/virtualbricks.template.glade:5308 #: share/virtualbricks.template.glade:5504 #: share/virtualbricks.template.glade:5844 #: share/virtualbricks.template.glade:6031 #: share/virtualbricks.template.glade:6227 #: share/virtualbricks.template.glade:6585 #: share/virtualbricks.template.glade:6772 #: share/virtualbricks.template.glade:6968 #: share/virtualbricks.template.glade:7306 #: share/virtualbricks.template.glade:7493 #: share/virtualbricks.template.glade:7689 #: share/virtualbricks.template.glade:8051 #: share/virtualbricks.template.glade:8238 #: share/virtualbricks.template.glade:8434 #: share/virtualbricks.template.glade:8772 #: share/virtualbricks.template.glade:8959 #: share/virtualbricks.template.glade:9155 #: share/virtualbricks.template.glade:9507 #: share/virtualbricks.template.glade:9577 #: share/virtualbricks.template.glade:9656 #: share/virtualbricks.template.glade:3669 #: share/virtualbricks.template.glade:3856 #: share/virtualbricks.template.glade:4052 #: share/virtualbricks.template.glade:4393 #: share/virtualbricks.template.glade:4580 #: share/virtualbricks.template.glade:4776 #: share/virtualbricks.template.glade:5158 #: share/virtualbricks.template.glade:5345 #: share/virtualbricks.template.glade:5541 #: share/virtualbricks.template.glade:5881 #: share/virtualbricks.template.glade:6068 #: share/virtualbricks.template.glade:6264 #: share/virtualbricks.template.glade:6622 #: share/virtualbricks.template.glade:6809 #: share/virtualbricks.template.glade:7005 #: share/virtualbricks.template.glade:7343 #: share/virtualbricks.template.glade:7530 #: share/virtualbricks.template.glade:7726 #: share/virtualbricks.template.glade:8088 #: share/virtualbricks.template.glade:8275 #: share/virtualbricks.template.glade:8471 #: share/virtualbricks.template.glade:8809 #: share/virtualbricks.template.glade:8996 #: share/virtualbricks.template.glade:9192 #: share/virtualbricks.template.glade:9544 #: share/virtualbricks.template.glade:9614 #: share/virtualbricks.template.glade:9693 msgid "Base" msgstr "Base" #: share/virtualbricks.template.glade:3671 #: share/virtualbricks.template.glade:3858 #: share/virtualbricks.template.glade:4054 #: share/virtualbricks.template.glade:4395 #: share/virtualbricks.template.glade:4582 #: share/virtualbricks.template.glade:4778 #: share/virtualbricks.template.glade:5160 #: share/virtualbricks.template.glade:5347 #: share/virtualbricks.template.glade:5543 #: share/virtualbricks.template.glade:5883 #: share/virtualbricks.template.glade:6070 #: share/virtualbricks.template.glade:6266 #: share/virtualbricks.template.glade:6624 #: share/virtualbricks.template.glade:6811 #: share/virtualbricks.template.glade:7007 #: share/virtualbricks.template.glade:7345 #: share/virtualbricks.template.glade:7532 #: share/virtualbricks.template.glade:7728 #: share/virtualbricks.template.glade:8090 #: share/virtualbricks.template.glade:8277 #: share/virtualbricks.template.glade:8473 #: share/virtualbricks.template.glade:8811 #: share/virtualbricks.template.glade:8998 #: share/virtualbricks.template.glade:9194 #: share/virtualbricks.template.glade:3708 #: share/virtualbricks.template.glade:3895 #: share/virtualbricks.template.glade:4091 #: share/virtualbricks.template.glade:4432 #: share/virtualbricks.template.glade:4619 #: share/virtualbricks.template.glade:4815 #: share/virtualbricks.template.glade:5197 #: share/virtualbricks.template.glade:5384 #: share/virtualbricks.template.glade:5580 #: share/virtualbricks.template.glade:5920 #: share/virtualbricks.template.glade:6107 #: share/virtualbricks.template.glade:6303 #: share/virtualbricks.template.glade:6661 #: share/virtualbricks.template.glade:6848 #: share/virtualbricks.template.glade:7044 #: share/virtualbricks.template.glade:7382 #: share/virtualbricks.template.glade:7569 #: share/virtualbricks.template.glade:7765 #: share/virtualbricks.template.glade:8127 #: share/virtualbricks.template.glade:8314 #: share/virtualbricks.template.glade:8510 #: share/virtualbricks.template.glade:8848 #: share/virtualbricks.template.glade:9035 #: share/virtualbricks.template.glade:9231 msgid "±" msgstr "±" #: share/virtualbricks.template.glade:3692 #: share/virtualbricks.template.glade:3879 #: share/virtualbricks.template.glade:4075 #: share/virtualbricks.template.glade:4416 #: share/virtualbricks.template.glade:4603 #: share/virtualbricks.template.glade:4799 #: share/virtualbricks.template.glade:5181 #: share/virtualbricks.template.glade:5368 #: share/virtualbricks.template.glade:5564 #: share/virtualbricks.template.glade:5904 #: share/virtualbricks.template.glade:6091 #: share/virtualbricks.template.glade:6287 #: share/virtualbricks.template.glade:6645 #: share/virtualbricks.template.glade:6832 #: share/virtualbricks.template.glade:7028 #: share/virtualbricks.template.glade:7366 #: share/virtualbricks.template.glade:7553 #: share/virtualbricks.template.glade:7749 #: share/virtualbricks.template.glade:8111 #: share/virtualbricks.template.glade:8298 #: share/virtualbricks.template.glade:8494 #: share/virtualbricks.template.glade:8832 #: share/virtualbricks.template.glade:9019 #: share/virtualbricks.template.glade:9215 #: share/virtualbricks.template.glade:3729 #: share/virtualbricks.template.glade:3916 #: share/virtualbricks.template.glade:4112 #: share/virtualbricks.template.glade:4453 #: share/virtualbricks.template.glade:4640 #: share/virtualbricks.template.glade:4836 #: share/virtualbricks.template.glade:5218 #: share/virtualbricks.template.glade:5405 #: share/virtualbricks.template.glade:5601 #: share/virtualbricks.template.glade:5941 #: share/virtualbricks.template.glade:6128 #: share/virtualbricks.template.glade:6324 #: share/virtualbricks.template.glade:6682 #: share/virtualbricks.template.glade:6869 #: share/virtualbricks.template.glade:7065 #: share/virtualbricks.template.glade:7403 #: share/virtualbricks.template.glade:7590 #: share/virtualbricks.template.glade:7786 #: share/virtualbricks.template.glade:8148 #: share/virtualbricks.template.glade:8335 #: share/virtualbricks.template.glade:8531 #: share/virtualbricks.template.glade:8869 #: share/virtualbricks.template.glade:9056 #: share/virtualbricks.template.glade:9252 msgid "Jitter" msgstr "Variaz." #: share/virtualbricks.template.glade:3731 #: share/virtualbricks.template.glade:3918 #: share/virtualbricks.template.glade:4114 #: share/virtualbricks.template.glade:4455 #: share/virtualbricks.template.glade:4642 #: share/virtualbricks.template.glade:4838 #: share/virtualbricks.template.glade:5220 #: share/virtualbricks.template.glade:5407 #: share/virtualbricks.template.glade:5603 #: share/virtualbricks.template.glade:5943 #: share/virtualbricks.template.glade:6130 #: share/virtualbricks.template.glade:6326 #: share/virtualbricks.template.glade:6684 #: share/virtualbricks.template.glade:6871 #: share/virtualbricks.template.glade:7067 #: share/virtualbricks.template.glade:7405 #: share/virtualbricks.template.glade:7592 #: share/virtualbricks.template.glade:7788 #: share/virtualbricks.template.glade:8150 #: share/virtualbricks.template.glade:8337 #: share/virtualbricks.template.glade:8533 #: share/virtualbricks.template.glade:8871 #: share/virtualbricks.template.glade:9058 #: share/virtualbricks.template.glade:9254 #: share/virtualbricks.template.glade:3768 #: share/virtualbricks.template.glade:3955 #: share/virtualbricks.template.glade:4151 #: share/virtualbricks.template.glade:4492 #: share/virtualbricks.template.glade:4679 #: share/virtualbricks.template.glade:4875 #: share/virtualbricks.template.glade:5257 #: share/virtualbricks.template.glade:5444 #: share/virtualbricks.template.glade:5640 #: share/virtualbricks.template.glade:5980 #: share/virtualbricks.template.glade:6167 #: share/virtualbricks.template.glade:6363 #: share/virtualbricks.template.glade:6721 #: share/virtualbricks.template.glade:6908 #: share/virtualbricks.template.glade:7104 #: share/virtualbricks.template.glade:7442 #: share/virtualbricks.template.glade:7629 #: share/virtualbricks.template.glade:7825 #: share/virtualbricks.template.glade:8187 #: share/virtualbricks.template.glade:8374 #: share/virtualbricks.template.glade:8570 #: share/virtualbricks.template.glade:8908 #: share/virtualbricks.template.glade:9095 #: share/virtualbricks.template.glade:9291 msgid "%" msgstr "%" #: share/virtualbricks.template.glade:3751 #: share/virtualbricks.template.glade:3938 #: share/virtualbricks.template.glade:4134 #: share/virtualbricks.template.glade:4858 #: share/virtualbricks.template.glade:5240 #: share/virtualbricks.template.glade:5427 #: share/virtualbricks.template.glade:5623 #: share/virtualbricks.template.glade:5963 #: share/virtualbricks.template.glade:6150 #: share/virtualbricks.template.glade:6346 #: share/virtualbricks.template.glade:6704 #: share/virtualbricks.template.glade:6891 #: share/virtualbricks.template.glade:7087 #: share/virtualbricks.template.glade:7425 #: share/virtualbricks.template.glade:7612 #: share/virtualbricks.template.glade:7808 #: share/virtualbricks.template.glade:8170 #: share/virtualbricks.template.glade:8357 #: share/virtualbricks.template.glade:8553 #: share/virtualbricks.template.glade:8891 #: share/virtualbricks.template.glade:9078 #: share/virtualbricks.template.glade:9274 #: share/virtualbricks.template.glade:3788 #: share/virtualbricks.template.glade:3975 #: share/virtualbricks.template.glade:4171 #: share/virtualbricks.template.glade:4895 #: share/virtualbricks.template.glade:5277 #: share/virtualbricks.template.glade:5464 #: share/virtualbricks.template.glade:5660 #: share/virtualbricks.template.glade:6000 #: share/virtualbricks.template.glade:6187 #: share/virtualbricks.template.glade:6383 #: share/virtualbricks.template.glade:6741 #: share/virtualbricks.template.glade:6928 #: share/virtualbricks.template.glade:7124 #: share/virtualbricks.template.glade:7462 #: share/virtualbricks.template.glade:7649 #: share/virtualbricks.template.glade:7845 #: share/virtualbricks.template.glade:8207 #: share/virtualbricks.template.glade:8394 #: share/virtualbricks.template.glade:8590 #: share/virtualbricks.template.glade:8928 #: share/virtualbricks.template.glade:9115 #: share/virtualbricks.template.glade:9311 msgid "Distrib." msgstr "Distrib." #: share/virtualbricks.template.glade:3780 #: share/virtualbricks.template.glade:4504 #: share/virtualbricks.template.glade:5269 #: share/virtualbricks.template.glade:5992 #: share/virtualbricks.template.glade:6733 #: share/virtualbricks.template.glade:7454 #: share/virtualbricks.template.glade:8199 #: share/virtualbricks.template.glade:8920 #: share/virtualbricks.template.glade:9538 #: share/virtualbricks.template.glade:3817 #: share/virtualbricks.template.glade:4541 #: share/virtualbricks.template.glade:5306 #: share/virtualbricks.template.glade:6029 #: share/virtualbricks.template.glade:6770 #: share/virtualbricks.template.glade:7491 #: share/virtualbricks.template.glade:8236 #: share/virtualbricks.template.glade:8957 #: share/virtualbricks.template.glade:9575 msgid "Left to Right" msgstr "" #: share/virtualbricks.template.glade:3975 #: share/virtualbricks.template.glade:4699 #: share/virtualbricks.template.glade:5464 #: share/virtualbricks.template.glade:6187 #: share/virtualbricks.template.glade:6928 #: share/virtualbricks.template.glade:7649 #: share/virtualbricks.template.glade:8394 #: share/virtualbricks.template.glade:9115 #: share/virtualbricks.template.glade:9616 #: share/virtualbricks.template.glade:4012 #: share/virtualbricks.template.glade:4736 #: share/virtualbricks.template.glade:5501 #: share/virtualbricks.template.glade:6224 #: share/virtualbricks.template.glade:6965 #: share/virtualbricks.template.glade:7686 #: share/virtualbricks.template.glade:8431 #: share/virtualbricks.template.glade:9152 #: share/virtualbricks.template.glade:9653 msgid "Both Directions" msgstr "" #: share/virtualbricks.template.glade:4172 #: share/virtualbricks.template.glade:4896 #: share/virtualbricks.template.glade:5661 #: share/virtualbricks.template.glade:6384 #: share/virtualbricks.template.glade:7125 #: share/virtualbricks.template.glade:7846 #: share/virtualbricks.template.glade:8591 #: share/virtualbricks.template.glade:9312 #: share/virtualbricks.template.glade:9696 #: share/virtualbricks.template.glade:4209 #: share/virtualbricks.template.glade:4933 #: share/virtualbricks.template.glade:5698 #: share/virtualbricks.template.glade:6421 #: share/virtualbricks.template.glade:7162 #: share/virtualbricks.template.glade:7883 #: share/virtualbricks.template.glade:8628 #: share/virtualbricks.template.glade:9349 #: share/virtualbricks.template.glade:9733 msgid "Right to Left" msgstr "" #: share/virtualbricks.template.glade:4198 #: share/virtualbricks.template.glade:4235 msgid "Bandwidth Restriction" msgstr "" #: share/virtualbricks.template.glade:4484 #: share/virtualbricks.template.glade:4521 msgid "" "Uniform\n" "Gaussian" msgstr "" #: share/virtualbricks.template.glade:4922 #: share/virtualbricks.template.glade:4959 msgid "Interface Speed" msgstr "" #: share/virtualbricks.template.glade:4941 #: share/virtualbricks.template.glade:4978 msgid "Enable(advanced)" msgstr "" #: share/virtualbricks.template.glade:4993 #: share/virtualbricks.template.glade:5030 msgid "Bandwidth" msgstr "Larghezza di banda" #: share/virtualbricks.template.glade:5687 #: share/virtualbricks.template.glade:5724 msgid "Packet Delay" msgstr "" #: share/virtualbricks.template.glade:6410 #: share/virtualbricks.template.glade:6447 msgid "Channel Buffer Size" msgstr "" #: share/virtualbricks.template.glade:6458 virtualbricks/brickfactory.py:822 #: share/virtualbricks.template.glade:6495 virtualbricks/brickfactory.py:885 msgid "Delay" msgstr "Ritardo" #: share/virtualbricks.template.glade:7151 #: share/virtualbricks.template.glade:7188 msgid "Packet Loss" msgstr "" #: share/virtualbricks.template.glade:7872 #: share/virtualbricks.template.glade:7909 msgid "Packet Duplication" msgstr "" #: share/virtualbricks.template.glade:7920 #: share/virtualbricks.template.glade:7957 msgid "Disruptions 1/3" msgstr "" #: share/virtualbricks.template.glade:8617 #: share/virtualbricks.template.glade:8654 msgid "Noise" msgstr "" #: share/virtualbricks.template.glade:9338 #: share/virtualbricks.template.glade:9375 msgid "Lost Burst" msgstr "" #: share/virtualbricks.template.glade:9376 #: share/virtualbricks.template.glade:9413 msgid "Disruptions 2/3" msgstr "" #: share/virtualbricks.template.glade:9722 #: share/virtualbricks.template.glade:9759 msgid "Maximum Transmission Unit (MTU)" msgstr "" #: share/virtualbricks.template.glade:9764 #: share/virtualbricks.template.glade:9801 msgid "Disruptions 3/3" msgstr "" #: share/virtualbricks.template.glade:9800 #: share/virtualbricks.template.glade:9837 msgid "Number of ports: " msgstr "Numero di porte:" #: share/virtualbricks.template.glade:9826 #: share/virtualbricks.template.glade:9863 msgid "Use FSTP" msgstr "Usa FSTP" #: share/virtualbricks.template.glade:9838 #: share/virtualbricks.template.glade:9875 msgid "Hub mode" msgstr "Modalità Hub" #: share/virtualbricks.template.glade:9860 #: share/virtualbricks.template.glade:9897 msgid "Switch Configuration" msgstr "Configurazione Switch" #: share/virtualbricks.template.glade:9910 #: share/virtualbricks.template.glade:9947 msgid "" " \n" "\n" msgstr "" " \n" "\n" #: share/virtualbricks.template.glade:9941 #: share/virtualbricks.template.glade:9978 msgid "Don't touch interface settings" msgstr "Non toccare le impostazioni di interfaccia" #: share/virtualbricks.template.glade:9951 #: share/virtualbricks.template.glade:9988 msgid "Use DHCP" msgstr "Usa DHCP" #: share/virtualbricks.template.glade:9966 #: share/virtualbricks.template.glade:10003 msgid "Manual settings" msgstr "Impostazion manuali" #: share/virtualbricks.template.glade:9996 #: share/virtualbricks.template.glade:10033 msgid "IP Address: " msgstr "Indirizzo IP:" #: share/virtualbricks.template.glade:10003 #: share/virtualbricks.template.glade:10040 msgid "Netmask: " msgstr "Netmask: " #: share/virtualbricks.template.glade:10014 #: share/virtualbricks.template.glade:10051 msgid "Gateway: " msgstr "Gateway: " #: share/virtualbricks.template.glade:10028 #: share/virtualbricks.template.glade:10065 msgid "10.0.0.1" msgstr "10.0.0.1" #: share/virtualbricks.template.glade:10043 #: share/virtualbricks.template.glade:10080 msgid "255.0.0.0" msgstr "255.0.0.0" #: share/virtualbricks.template.glade:10084 #: share/virtualbricks.template.glade:10121 msgid "Tap Configuration" msgstr "Configurazione Tap" #: share/virtualbricks.template.glade:10177 #: share/virtualbricks.template.glade:14202 #: share/virtualbricks.template.glade:10214 #: share/virtualbricks.template.glade:14239 msgid "Delay:" msgstr "Ritardo:" #: share/virtualbricks.template.glade:10209 virtualbricks/brickfactory.py:825 #: share/virtualbricks.template.glade:10246 virtualbricks/brickfactory.py:888 msgid "Actions" msgstr "Azioni" #: share/virtualbricks.template.glade:10248 #: share/virtualbricks.template.glade:10285 msgid "Event Configuration" msgstr "Configurazione Evento" #: share/virtualbricks.template.glade:10283 #: share/virtualbricks.template.glade:10398 #: share/virtualbricks.template.glade:10320 #: share/virtualbricks.template.glade:10435 msgid "Connect to" msgstr "Connetti a" #: share/virtualbricks.template.glade:10315 #: share/virtualbricks.template.glade:10352 msgid "Listen to port:" msgstr "Porta di ascolto:" #: share/virtualbricks.template.glade:10325 #: share/virtualbricks.template.glade:10362 msgid "Expect password:" msgstr "Password attesa:" #: share/virtualbricks.template.glade:10364 #: share/virtualbricks.template.glade:10401 msgid "Tunnel server Configuration" msgstr "Configurazione Tunnel server" #: share/virtualbricks.template.glade:10418 #: share/virtualbricks.template.glade:12758 #: share/virtualbricks.template.glade:10455 #: share/virtualbricks.template.glade:12795 msgid "port:" msgstr "porta:" #: share/virtualbricks.template.glade:10448 #: share/virtualbricks.template.glade:13780 #: share/virtualbricks.template.glade:10485 #: share/virtualbricks.template.glade:13817 msgid "Tunnel Server" msgstr "Tunnel Server" #: share/virtualbricks.template.glade:10473 #: share/virtualbricks.template.glade:10510 msgid "Password:" msgstr "Password:" #: share/virtualbricks.template.glade:10484 #: share/virtualbricks.template.glade:10521 msgid "Local port:" msgstr "Porta locale:" #: share/virtualbricks.template.glade:10527 #: share/virtualbricks.template.glade:10564 msgid "Tunnel client Configuration" msgstr "Configurazione Tunnel client" #: share/virtualbricks.template.glade:10566 #: share/virtualbricks.template.glade:10603 msgid "WAIT..." msgstr "" #: share/virtualbricks.template.glade:10671 #: share/virtualbricks.template.glade:10708 msgid "Virtualbricks Settings" msgstr "Impostazioni Virtualbricks" #: share/virtualbricks.template.glade:10684 #: share/virtualbricks.template.glade:10721 msgid "System Settings" msgstr "Impostazioni di sistema" #: share/virtualbricks.template.glade:10719 #: share/virtualbricks.template.glade:10756 msgid "Bricks directory" msgstr "Direttorio Mattoni" #: share/virtualbricks.template.glade:10727 #: share/virtualbricks.template.glade:10863 #: share/virtualbricks.template.glade:11012 #: share/virtualbricks.template.glade:11096 #: share/virtualbricks.template.glade:10764 #: share/virtualbricks.template.glade:10900 #: share/virtualbricks.template.glade:11049 #: share/virtualbricks.template.glade:11133 msgid "Select A Folder" msgstr "Seleziona una carella" #: share/virtualbricks.template.glade:10738 #: share/virtualbricks.template.glade:10775 msgid "X-window terminal command" msgstr "" "Comando per\n" "terminale X-window" #: share/virtualbricks.template.glade:10749 #: share/virtualbricks.template.glade:10786 msgid "X-window sudo command" msgstr "" "Comando per\n" "X-window sudo" #: share/virtualbricks.template.glade:10760 #: share/virtualbricks.template.glade:10797 msgid "your favorite x-terminal-emulator" msgstr "x-terminal-emulator preferito" #: share/virtualbricks.template.glade:10774 #: share/virtualbricks.template.glade:10811 msgid "command to perform administrative actions on your system" msgstr "comando per eseguire azioni amministrative nel sistema" #: share/virtualbricks.template.glade:10798 #: share/virtualbricks.template.glade:10835 msgid "Enable SysTray" msgstr "Abilita SysTray" #: share/virtualbricks.template.glade:10819 #: share/virtualbricks.template.glade:10856 msgid "General" msgstr "Generali" #: share/virtualbricks.template.glade:10855 #: share/virtualbricks.template.glade:10892 msgid "VDE binaries path" msgstr "" "Percorso\n" "binari VDE" #: share/virtualbricks.template.glade:10861 #: share/virtualbricks.template.glade:10898 msgid "Path for vde components installed on the system" msgstr "Percorso per componenti vde installati nel sistema" #: share/virtualbricks.template.glade:10876 #: share/virtualbricks.template.glade:11025 #: share/virtualbricks.template.glade:10913 #: share/virtualbricks.template.glade:11062 msgid "Status:" msgstr "Stato:" #: share/virtualbricks.template.glade:10892 #: share/virtualbricks.template.glade:10929 msgid "" "Error:\n" "invalid path for vde binaries" msgstr "" "Errore:\n" "percorso non valido per i binari di vde" #: share/virtualbricks.template.glade:10919 #: share/virtualbricks.template.glade:10956 msgid "Use python support" msgstr "Usa supporto python" #: share/virtualbricks.template.glade:10923 #: share/virtualbricks.template.glade:10960 msgid "Use native python support from libvdeplug" msgstr "Usa supporto nativo python da libvdeplug" #: share/virtualbricks.template.glade:10932 #: share/virtualbricks.template.glade:10969 msgid "Allow female plugs on devices" msgstr "Permetti plugs femmina nei dispositivi" #: share/virtualbricks.template.glade:10936 #: share/virtualbricks.template.glade:10973 msgid "Allow use of female plugs with all brick types" msgstr "Permetti l'uso dei plugs femmina con tutti i tipi di mattoni" #: share/virtualbricks.template.glade:10945 #: share/virtualbricks.template.glade:10982 msgid "Network topology loop detection" msgstr "Rileva loop della topologia di rete" #: share/virtualbricks.template.glade:10949 #: share/virtualbricks.template.glade:10986 msgid "" "If enabled, detect network loops when starting the bricks, and generate an " "error." msgstr "" "Se abilitato, rileva loop di rete quando si avviano i mattoni, e genera un " "errore." #: share/virtualbricks.template.glade:10963 #: share/virtualbricks.template.glade:11000 msgid "Vde" msgstr "Vde" #: share/virtualbricks.template.glade:11004 #: share/virtualbricks.template.glade:11041 msgid "Qemu/KVM binaries path" msgstr "Percorso binari Qemu/KVM" #: share/virtualbricks.template.glade:11010 #: share/virtualbricks.template.glade:11047 msgid "Path for qemu and kvm binaries" msgstr "Percorso per i binari di qemu e kvm" #: share/virtualbricks.template.glade:11041 #: share/virtualbricks.template.glade:11078 msgid "" "Error:\n" "invalid path for qemu/kvm binaries" msgstr "" "Errore:\n" "percorso non valido per i binari di qemu/kvm" #: share/virtualbricks.template.glade:11088 #: share/virtualbricks.template.glade:11125 msgid "Disk images repository" msgstr "Repository per le immagini disco" #: share/virtualbricks.template.glade:11094 #: share/virtualbricks.template.glade:11131 msgid "Directory that contains hard disk images" msgstr "Direttorio che contiene le immagini degli hard disk" #: share/virtualbricks.template.glade:11112 #: share/virtualbricks.template.glade:11149 msgid "Disk Images" msgstr "immagini disco" #: share/virtualbricks.template.glade:11140 #: share/virtualbricks.template.glade:11177 msgid "Use KVM" msgstr "Usa KVM" #: share/virtualbricks.template.glade:11144 #: share/virtualbricks.template.glade:11181 msgid "Allow the use of kernel-based virtual machine (recommended)" msgstr "Permetti l'uso di kernel-based virtual machine (raccomandato)" #: share/virtualbricks.template.glade:11154 #: share/virtualbricks.template.glade:11191 msgid "Enable KSM" msgstr "Abilita KSM" #: share/virtualbricks.template.glade:11158 #: share/virtualbricks.template.glade:11195 msgid "Allow using the Kernel SamePage Merging support to enhance scalability" msgstr "" "Permetti l'uso del supporto a Kernel SamePage Merging per potenziare la " "scalabilità" #: share/virtualbricks.template.glade:11173 #: share/virtualbricks.template.glade:11210 msgid "Use kqemu" msgstr "Usa Kqemu" #: share/virtualbricks.template.glade:11177 #: share/virtualbricks.template.glade:11214 msgid "Use old kqemu support" msgstr "Usa vecchio supporto kqemu" #: share/virtualbricks.template.glade:11191 #: share/virtualbricks.template.glade:11228 msgid "X86 optimizations" msgstr "Ottimizzazioni X86" #: share/virtualbricks.template.glade:11208 #: share/virtualbricks.template.glade:11245 msgid "CD-Rom/DVD/Floppy Devices" msgstr "Dispositivi CD-Rom/DVD/Floppy " #: share/virtualbricks.template.glade:11228 #: share/virtualbricks.template.glade:11265 msgid "" "Add your \"real\" physical drive volumes like CDR, DVD or Floppy devices " "here." msgstr "" "Aggiungi qui il tuo supporto drive fisico \"reale\" come CDR, DVD o " "dispositivi Floppy." #: share/virtualbricks.template.glade:11245 #: share/virtualbricks.template.glade:11282 msgid "Name: " msgstr "Nome:" #: share/virtualbricks.template.glade:11266 #: share/virtualbricks.template.glade:11303 msgid "Device Path: " msgstr "Percorso dispositivo:" #: share/virtualbricks.template.glade:11286 #: share/virtualbricks.template.glade:11323 msgid "Add" msgstr "Aggiungi" #: share/virtualbricks.template.glade:11330 #: share/virtualbricks.template.glade:11367 msgid "Qemu/KVM " msgstr "Qemu/KVM " #: share/virtualbricks.template.glade:11417 #: share/virtualbricks.template.glade:11454 msgid "Add Bookmark" msgstr "Aggiungi Segnalibro" #: share/virtualbricks.template.glade:11431 #: share/virtualbricks.template.glade:11468 msgid "Name:" msgstr "Nome:" #: share/virtualbricks.template.glade:11456 #: share/virtualbricks.template.glade:11493 msgid "Path:" msgstr "Percorso:" #: share/virtualbricks.template.glade:11485 #: share/virtualbricks.template.glade:11522 msgid "Select A Icon" msgstr "Seleziona un'Icona" #: share/virtualbricks.template.glade:11495 #: share/virtualbricks.template.glade:11532 msgid "Icon for this Machine" msgstr "Icona per questa Macchina" #: share/virtualbricks.template.glade:11575 #: share/virtualbricks.template.glade:12064 #: share/virtualbricks.template.glade:11612 #: share/virtualbricks.template.glade:12101 msgid "show qemu volume info for selected image" msgstr "mostra le info del supporto per l'immagine selezionata" #: share/virtualbricks.template.glade:11590 #: share/virtualbricks.template.glade:11627 msgid "remove this entry from My Machines" msgstr "rimuovi questo elemento delle Mie Macchine" #: share/virtualbricks.template.glade:11600 #: share/virtualbricks.template.glade:11637 msgid "About: Virtualbricks" msgstr "Informazioni su: Virtualbricks" #: share/virtualbricks.template.glade:11656 #: share/virtualbricks.template.glade:11693 msgid "" "Virtualbricks is a GNU/Linux desktop gui for Qemu/KVM and Virtual " "Distributed Ethernet.\n" "\n" "Virtualbricks is licensed under the terms of the GPL (General Public " "Licence) Version 2.\n" "© 2011 Daniele Lacamera, Rainer Haage and the virtualbricks team on " "Launchpad. \n" "\n" "VDE - Virtual Distributed Ethernet - © 2003-2011 Renzo Davoli.\n" "QEMU - Copyright © 2005-2011 Fabrice Bellard.\n" "QEMU is a trademark of Fabrice Bellard.\n" "\n" "Icons for remote hosts are Copyleft David Vignoni - http://www.icon-king." "com/ License: LGPL\n" "\n" "If you find virtualbricks useful for your business, please consider making a " "donation." msgstr "" #: share/virtualbricks.template.glade:11713 #: share/virtualbricks.template.glade:11750 msgid "create new empty image" msgstr "crea una nuova immagine vuota" #: share/virtualbricks.template.glade:11730 #: share/virtualbricks.template.glade:11767 msgid "create new empty Disk image\n" msgstr "crea una nuova immagine Disco vuota\n" #: share/virtualbricks.template.glade:11743 #: share/virtualbricks.template.glade:11780 msgid "Target Folder for the new image" msgstr "Cartella di destinazione per la nuova immagine" #: share/virtualbricks.template.glade:11753 #: share/virtualbricks.template.glade:11790 msgid "Select A Directory" msgstr "Selezione Una Directory" #: share/virtualbricks.template.glade:11776 #: share/virtualbricks.template.glade:11813 msgid "Name of the new image (or base image)" msgstr "" "Nome della nuova immagine\n" "(o dell'immagine base)" #: share/virtualbricks.template.glade:11791 #: share/virtualbricks.template.glade:11828 msgid "Enter a filename for the new image" msgstr "Inserisci un nome file per la nuova immagine" #: share/virtualbricks.template.glade:11822 #: share/virtualbricks.template.glade:11859 msgid "Image format" msgstr "Formato immagine" #: share/virtualbricks.template.glade:11833 #: share/virtualbricks.template.glade:11870 msgid "" "Auto\n" "raw\n" "qcow\n" "qcow2\n" "cow\n" "vmdk\n" "cloop" msgstr "" "Auto\n" "raw\n" "qcow\n" "qcow2\n" "cow\n" "vmdk\n" "cloop" #: share/virtualbricks.template.glade:11860 #: share/virtualbricks.template.glade:11897 msgid "Size" msgstr "Dimensione" #: share/virtualbricks.template.glade:11875 #: share/virtualbricks.template.glade:11912 msgid "Size of the new image" msgstr "Dimensione della nuova immagine" #: share/virtualbricks.template.glade:11889 #: share/virtualbricks.template.glade:11926 msgid "" "KB\n" "MB\n" "GB" msgstr "" "KB\n" "MB\n" "GB" #: share/virtualbricks.template.glade:11949 #: share/virtualbricks.template.glade:11986 msgid "Create" msgstr "Crea" #: share/virtualbricks.template.glade:11999 #: share/virtualbricks.template.glade:12036 msgid "message" msgstr "messaggio" #: share/virtualbricks.template.glade:12074 #: share/virtualbricks.template.glade:12111 msgid "add this image to bookmarks" msgstr "aggiungi l'immagine ai segnalibri" #: share/virtualbricks.template.glade:12084 #: share/virtualbricks.template.glade:12121 msgid "Control monitor" msgstr "Monitor di controllo" #: share/virtualbricks.template.glade:12099 #: share/virtualbricks.template.glade:12136 msgid "control monitor for selected qemu job" msgstr "monitor di controllo per il lavoro qemu selezionato" #: share/virtualbricks.template.glade:12115 #: share/virtualbricks.template.glade:12152 msgid "kill emulation immediately" msgstr "uccidi emulazione immediatamente" #: share/virtualbricks.template.glade:12128 #: share/virtualbricks.template.glade:12165 msgid "reset emulation" msgstr "resetta emulazione" #: share/virtualbricks.template.glade:12149 #: share/virtualbricks.template.glade:12186 msgid "pause emulation" msgstr "sospendi emulazione" #: share/virtualbricks.template.glade:12162 #: share/virtualbricks.template.glade:12199 msgid "resume emulation" msgstr "riprendi emulazione" #: share/virtualbricks.template.glade:12190 #: share/virtualbricks.template.glade:12227 msgid "Available block devices" msgstr "Dispositivi a blocchi disponibili" #: share/virtualbricks.template.glade:12208 #: share/virtualbricks.template.glade:12245 msgid "" "This is a list of all blockdevices used by the emulation. Rightclick an " "entry to eject. (hd volumes normally can not be ejected)" msgstr "" "Questa è una lista di tutti i dispositivi a blocchi usati dall'emulazione.\n" "Tasto destro su una voce per espellerla. (i supporti hd normalmente non " "possono essere espulsi)" #: share/virtualbricks.template.glade:12222 #: share/virtualbricks.template.glade:12259 msgid "change soure of block devices" msgstr "cambia la sorgente dei dispositivi a blocchi" #: share/virtualbricks.template.glade:12238 #: share/virtualbricks.template.glade:12253 #: share/virtualbricks.template.glade:12270 #: share/virtualbricks.template.glade:12275 #: share/virtualbricks.template.glade:12290 #: share/virtualbricks.template.glade:12307 msgid "Change" msgstr "Cambia" #: share/virtualbricks.template.glade:12242 #: share/virtualbricks.template.glade:12279 msgid "change the source for qemu cdrom device to the selected image or drive" msgstr "" "cambia la sorgente del dispositivo cdrom qemu con l'immagine o il drive " "selezionato" #: share/virtualbricks.template.glade:12257 #: share/virtualbricks.template.glade:12294 msgid "" "change the source for qemu floppy A device to the selected image or drive" msgstr "" "cambia la sorgente per il dispositivo floppy A qemu con l'immagine o il " "drive selezionato" #: share/virtualbricks.template.glade:12274 #: share/virtualbricks.template.glade:12311 msgid "" "change the source for qemu floppy B device to the selected image or drive" msgstr "" "cambia la sorgente per il dispositivo floppy B qemu con l'immagine o il " "drive selezionato" #: share/virtualbricks.template.glade:12289 #: share/virtualbricks.template.glade:12326 msgid "cdrom" msgstr "cdrom" #: share/virtualbricks.template.glade:12332 #: share/virtualbricks.template.glade:12345 #: share/virtualbricks.template.glade:12361 #: share/virtualbricks.template.glade:12369 #: share/virtualbricks.template.glade:12382 #: share/virtualbricks.template.glade:12398 msgid "None" msgstr "Nessuno" #: share/virtualbricks.template.glade:12397 #: share/virtualbricks.template.glade:12434 msgid "Available host usb devices" msgstr "Dispositivi usb host disponibili" #: share/virtualbricks.template.glade:12415 #: share/virtualbricks.template.glade:12452 msgid "" "All available host usb-devices. rightclick to attach a device to the virtual " "engine (you must have write access to /proc/bus/usb to attach devices)" msgstr "" "Tutti i dispositivi usb host disponibili. Tasto destro per collegare un " "dispositivo al motore virtuale\n" "(devi avere l'accesso in scrittura su /proc/bus/usb per collegare un " "dispositivo)" #: share/virtualbricks.template.glade:12429 #: share/virtualbricks.template.glade:12466 msgid "Attached guest usb devices" msgstr "Dispositivi usb guest collegati" #: share/virtualbricks.template.glade:12447 #: share/virtualbricks.template.glade:12484 msgid "" "All attached usb devices for this emulation. Rightclick to detach a device" msgstr "" "Tutti i dispositivi usb collegati per questa emulazione. Tasto destro per " "scollegare un dispositivo" #: share/virtualbricks.template.glade:12466 #: share/virtualbricks.template.glade:12503 msgid "USB" msgstr "USB" #: share/virtualbricks.template.glade:12478 #: share/virtualbricks.template.glade:12515 msgid "coming soon..." msgstr "coming soon..." #: share/virtualbricks.template.glade:12488 #: share/virtualbricks.template.glade:12525 msgid "Emulation" msgstr "Emulazione" #: share/virtualbricks.template.glade:12540 #: share/virtualbricks.template.glade:12577 msgid "open control monitor" msgstr "Apri console di controllo" #: share/virtualbricks.template.glade:12577 #: share/virtualbricks.template.glade:12614 msgid "Suspend Qemu" msgstr "Sospendi Qemu" #: share/virtualbricks.template.glade:12586 #: share/virtualbricks.template.glade:12623 msgid "Send ACPI poweroff" msgstr "Invia poweroff ACPI" #: share/virtualbricks.template.glade:12595 #: share/virtualbricks.template.glade:12632 msgid "Send ACPI hard reset" msgstr "Invia hard reset ACPI" #: share/virtualbricks.template.glade:12651 #: share/virtualbricks.template.glade:12688 msgid "eject / unmount selected device" msgstr "espelli / smonta il dispositivo selezionato" #: share/virtualbricks.template.glade:12659 #: share/virtualbricks.template.glade:12696 msgid "Setup new network card" msgstr "Configura una nuova interfaccia di rete" #: share/virtualbricks.template.glade:12672 #: share/virtualbricks.template.glade:12709 msgid "Network Type" msgstr "Tipo di rete" #: share/virtualbricks.template.glade:12684 #: share/virtualbricks.template.glade:12721 msgid "" "Open a TUN/TAP interface\n" "Use an already open TUN/TAP interface\n" "Open a listening TCP socket\n" "Use an already open TCP socket\n" "Connect to listening TCP socket\n" "Create shared VLAN via UDP multicast socket\n" "Use an already open UDP multicast socket" msgstr "" "Apri interfaccia TUN/TAP\n" "Usa una interfaccia TUN/TAP già aperta\n" "Apri socket TCP in ascolto\n" "Usa una socket TCP già aperta\n" "Connetti ad una socket TCP in ascolto\n" "Crea una VLAN condivisa via socket multicast UDP\n" "Usa una socket multicast UDP già aperta" #: share/virtualbricks.template.glade:12719 #: share/virtualbricks.template.glade:12756 msgid "IP address: " msgstr "Indirizzo IP:" #: share/virtualbricks.template.glade:12730 #: share/virtualbricks.template.glade:12767 msgid "MAC address: " msgstr "Indirizzo MAC: " #: share/virtualbricks.template.glade:12771 #: share/virtualbricks.template.glade:12808 msgid "VLAN:" msgstr "VLAN:" #: share/virtualbricks.template.glade:12852 #: share/virtualbricks.template.glade:12889 msgid "TUN/TAP configuration script:" msgstr "Script di configurazione TUN/TAP:" #: share/virtualbricks.template.glade:12863 #: share/virtualbricks.template.glade:12900 msgid "Name of network interface:" msgstr "Nome dell'interfaccia di rete:" #: share/virtualbricks.template.glade:12947 #: share/virtualbricks.template.glade:12984 msgid "File descriptor: " msgstr "Descrittore file:" #: share/virtualbricks.template.glade:13026 #: share/virtualbricks.template.glade:13063 msgid "Request" msgstr "Richiesta" #: share/virtualbricks.template.glade:13054 #: share/virtualbricks.template.glade:14382 #: share/virtualbricks.template.glade:13091 #: share/virtualbricks.template.glade:14419 msgid "Are you sure?" msgstr "Sei sicuro?" #: share/virtualbricks.template.glade:13113 #: share/virtualbricks.template.glade:13150 msgid "Add redirect" msgstr "Aggiungi ridirezione" #: share/virtualbricks.template.glade:13138 #: share/virtualbricks.template.glade:13175 msgid "TCP" msgstr "TCP" #: share/virtualbricks.template.glade:13154 #: share/virtualbricks.template.glade:13191 msgid "UDP" msgstr "UDP" #: share/virtualbricks.template.glade:13177 #: share/virtualbricks.template.glade:13225 #: share/virtualbricks.template.glade:13214 #: share/virtualbricks.template.glade:13262 msgid "port " msgstr "porta" #: share/virtualbricks.template.glade:13202 #: share/virtualbricks.template.glade:13239 msgid "to guest IP " msgstr "to guest IP " #: share/virtualbricks.template.glade:13254 #: share/virtualbricks.template.glade:13291 msgid "Add redirect(s)" msgstr "Aggiungi ridirezione(i)" #: share/virtualbricks.template.glade:13324 #: share/virtualbricks.template.glade:13361 msgid "Mode:" msgstr "Modalità:" #: share/virtualbricks.template.glade:13336 #: share/virtualbricks.template.glade:13373 msgid "DHCP" msgstr "DHCP" #: share/virtualbricks.template.glade:13349 #: share/virtualbricks.template.glade:13386 msgid "Manual" msgstr "Manuale" #: share/virtualbricks.template.glade:13387 #: share/virtualbricks.template.glade:13424 msgid "Address:" msgstr "Indirizzo:" #: share/virtualbricks.template.glade:13393 #: share/virtualbricks.template.glade:13430 msgid "Netmask:" msgstr "Netmask:" #: share/virtualbricks.template.glade:13437 #: share/virtualbricks.template.glade:13474 msgid "Advanced" msgstr "Avanzate" #: share/virtualbricks.template.glade:13458 #: share/virtualbricks.template.glade:13887 #: share/virtualbricks.template.glade:14242 #: share/virtualbricks.template.glade:13495 #: share/virtualbricks.template.glade:13924 #: share/virtualbricks.template.glade:14279 msgid "Cancel" msgstr "Annulla" #: share/virtualbricks.template.glade:13471 #: share/virtualbricks.template.glade:13902 #: share/virtualbricks.template.glade:14257 #: share/virtualbricks.template.glade:13508 #: share/virtualbricks.template.glade:13939 #: share/virtualbricks.template.glade:14294 msgid "Ok" msgstr "Ok" #: share/virtualbricks.template.glade:13537 #: share/virtualbricks.template.glade:13574 msgid "Switch" msgstr "Switch" #: share/virtualbricks.template.glade:13576 #: share/virtualbricks.template.glade:13613 msgid "Wire" msgstr "Wire" #: share/virtualbricks.template.glade:13615 #: share/virtualbricks.template.glade:13652 msgid "Wirefilter" msgstr "Wirefilter" #: share/virtualbricks.template.glade:13654 #: share/virtualbricks.template.glade:13691 msgid "Tap" msgstr "Tap" #: share/virtualbricks.template.glade:13702 #: share/virtualbricks.template.glade:13739 msgid "Tunnel Client" msgstr "Tunnel Client" #: share/virtualbricks.template.glade:13741 #: share/virtualbricks.template.glade:13778 msgid "Virtual Machine" msgstr "Macchina Virtuale" #: share/virtualbricks.template.glade:13805 #: share/virtualbricks.template.glade:13842 msgid "Run on remote host:" msgstr "" #: share/virtualbricks.template.glade:13853 #: share/virtualbricks.template.glade:13890 msgid "Brick name:" msgstr "Nome Mattone:" #: share/virtualbricks.template.glade:13931 #: share/virtualbricks.template.glade:13968 msgid "Event type selection" msgstr "Selezione del tipo di evento" #: share/virtualbricks.template.glade:13978 #: share/virtualbricks.template.glade:14015 msgid "Brick Start" msgstr "Avvia Mattone" #: share/virtualbricks.template.glade:14016 #: share/virtualbricks.template.glade:14053 msgid "Brick Stop" msgstr "Ferma Mattone" #: share/virtualbricks.template.glade:14055 #: share/virtualbricks.template.glade:14092 msgid "Brick Config" msgstr "Configura Mattone" #: share/virtualbricks.template.glade:14093 #: share/virtualbricks.template.glade:14130 msgid "" "Free\n" "Shell Command" msgstr "" "Comando di\n" "Shell Libero" #: share/virtualbricks.template.glade:14141 #: share/virtualbricks.template.glade:14178 msgid "Events Collation" msgstr "Collezione di Eventi" #: share/virtualbricks.template.glade:14184 #: share/virtualbricks.template.glade:14221 msgid "Event name:" msgstr "Nome Evento:" #: share/virtualbricks.template.glade:14214 #: share/virtualbricks.template.glade:14251 msgid "10" msgstr "10" #: share/virtualbricks.template.glade:14290 #: share/virtualbricks.template.glade:14745 #: share/virtualbricks.template.glade:14327 #: share/virtualbricks.template.glade:14782 msgid " " msgstr " " #: share/virtualbricks.template.glade:14301 #: share/virtualbricks.template.glade:14756 #: share/virtualbricks.template.glade:14338 #: share/virtualbricks.template.glade:14793 msgid "_Start/Stop" msgstr "_Avvia/Ferma" #: share/virtualbricks.template.glade:14309 #: share/virtualbricks.template.glade:14764 #: share/virtualbricks.template.glade:14346 #: share/virtualbricks.template.glade:14801 msgid "_Delete" msgstr "Ca_ncella" #: share/virtualbricks.template.glade:14317 #: share/virtualbricks.template.glade:14772 #: share/virtualbricks.template.glade:14354 #: share/virtualbricks.template.glade:14809 msgid "Make a C_opy" msgstr "Crea una Co_pia" #: share/virtualbricks.template.glade:14325 #: share/virtualbricks.template.glade:14780 #: share/virtualbricks.template.glade:14362 #: share/virtualbricks.template.glade:14817 msgid "Re_name" msgstr "_Rinomina" #: share/virtualbricks.template.glade:14333 #: share/virtualbricks.template.glade:14788 #: share/virtualbricks.template.glade:14370 #: share/virtualbricks.template.glade:14825 msgid "_Configure" msgstr "_Configura" #: share/virtualbricks.template.glade:14342 #: share/virtualbricks.template.glade:14379 msgid "_Resume VM" msgstr "R_iprendi VM" #: share/virtualbricks.template.glade:14350 #: share/virtualbricks.template.glade:14387 msgid "_Attach Event" msgstr "_Aggancia Evento" #: share/virtualbricks.template.glade:14390 #: share/virtualbricks.template.glade:14427 msgid "Confirm Action" msgstr "Conferma Azione" #: share/virtualbricks.template.glade:14465 #: share/virtualbricks.template.glade:14813 #: share/virtualbricks.template.glade:14502 #: share/virtualbricks.template.glade:14850 msgid "Choose a new name:" msgstr "Scegli un nuovo nome:" #: share/virtualbricks.template.glade:14532 #: share/virtualbricks.template.glade:14569 msgid "Virtualbricks: action in progress" msgstr "Virtualbricks: azione in corso" #: share/virtualbricks.template.glade:14547 #: share/virtualbricks.template.glade:14584 msgid "Please wait" msgstr "Prego attendere" #: share/virtualbricks.template.glade:14576 #: share/virtualbricks.template.glade:14613 msgid "Select Image file" msgstr "Selezionare il file immagine" #: share/virtualbricks.template.glade:14637 #: share/virtualbricks.template.glade:14674 msgid "Toggle window" msgstr "Attiva finestra" #: share/virtualbricks.template.glade:14650 #: share/virtualbricks.template.glade:14687 msgid "Close VB" msgstr "Chiudi VB" #: share/virtualbricks.template.glade:14658 #: share/virtualbricks.template.glade:14695 msgid "Shell command actions" msgstr "Azioni comandi di shell" #: share/virtualbricks.template.glade:14675 #: share/virtualbricks.template.glade:14712 msgid "" "Enter shell command:\n" "(each line is an action)" msgstr "" "Inserisci comando di shell:\n" "(ogni riga è un'azione)" #: share/virtualbricks.template.glade:14796 #: share/virtualbricks.template.glade:14833 msgid "New event name" msgstr "Nuovo nome evento" #: share/virtualbricks.template.glade:14881 #: share/virtualbricks.template.glade:14918 msgid "Bricks to add to the event" msgstr "Mattoni da aggiungere all'evento" #: share/virtualbricks.template.glade:14917 #: share/virtualbricks.template.glade:14954 msgid "Bricks available" msgstr "Mattoni disponibili" #: share/virtualbricks.template.glade:14942 #: share/virtualbricks.template.glade:14979 msgid "" "--->\n" "<---" msgstr "" "--->\n" "<---" #: share/virtualbricks.template.glade:15013 #: share/virtualbricks.template.glade:15050 msgid "Bricks added" msgstr "Mattoni aggiunti" #: share/virtualbricks.template.glade:15077 #: share/virtualbricks.template.glade:15114 msgid "Messages" msgstr "Messaggi" #: share/virtualbricks.template.glade:15203 #: share/virtualbricks.template.glade:15240 msgid "Start Event selection" msgstr "Selezione Evento di avvio" #: share/virtualbricks.template.glade:15217 #: share/virtualbricks.template.glade:15282 #: share/virtualbricks.template.glade:15254 #: share/virtualbricks.template.glade:15319 msgid "Assign Nothing" msgstr "Assegna niente" #: share/virtualbricks.template.glade:15268 #: share/virtualbricks.template.glade:15305 msgid "Stop Event selection" msgstr "Selezione Evento di arresto" #: share/virtualbricks.template.glade:15354 #: share/virtualbricks.template.glade:15391 msgid "Connect/Disconnect" msgstr "" #: share/virtualbricks.template.glade:15362 #: share/virtualbricks.template.glade:15399 msgid "Change Password" msgstr "" #: share/virtualbricks.template.glade:15370 #: share/virtualbricks.template.glade:15407 msgid "Auto-connect at startup" msgstr "" #: share/virtualbricks.template.glade:15378 #: share/virtualbricks.template.glade:15415 msgid "Delete" msgstr "" #: share/virtualbricks.template.glade:15384 #: share/virtualbricks.template.glade:15421 msgid "Authentication" msgstr "" #: share/virtualbricks.template.glade:15397 #: share/virtualbricks.template.glade:15434 msgid "Password for remote virtualbricks session:" msgstr "" #: virtualbricks/brickfactory.py:532 virtualbricks/brickfactory.py:584 #, python-format msgid "Starting: '%s'" msgstr "Avvio: '%s'" #: virtualbricks/brickfactory.py:565 virtualbricks/brickfactory.py:623 #, python-format msgid "Shutting down %s" msgstr "Arresto %s" #: virtualbricks/brickfactory.py:576 #, python-format msgid "can not stop brick (error code: '%s')" msgstr "impossibile fermare mattone (codice errore: '%s')" #: virtualbricks/brickfactory.py:582 virtualbricks/brickfactory.py:638 #, python-format msgid "can not send SIGTERM: '%s'" msgstr "impossibile inviare SIGTERM: '%s'" #: virtualbricks/brickfactory.py:646 virtualbricks/brickfactory.py:709 msgid "Error: cannot start a terminal emulator" msgstr "Errore: impossibile avviare un emulatore di terminale" #: virtualbricks/brickfactory.py:651 virtualbricks/brickfactory.py:714 msgid "Error running command line" msgstr "Errore nell'esecuzione della riga di comando" #: virtualbricks/brickfactory.py:658 virtualbricks/brickfactory.py:721 msgid "does not have a console" msgstr "non ha una console" #: virtualbricks/brickfactory.py:669 virtualbricks/brickfactory.py:732 msgid "error opening internal console" msgstr "errore nell'apertura della console interna" #: virtualbricks/brickfactory.py:714 virtualbricks/brickfactory.py:771 #: virtualbricks/brickfactory.py:777 virtualbricks/brickfactory.py:834 msgid "running" msgstr "acceso" #: virtualbricks/brickfactory.py:716 virtualbricks/brickfactory.py:1019 #: virtualbricks/brickfactory.py:1081 virtualbricks/brickfactory.py:1086 #: virtualbricks/brickfactory.py:1088 virtualbricks/brickfactory.py:1825 #: virtualbricks/brickfactory.py:1877 virtualbricks/brickfactory.py:779 #: virtualbricks/brickfactory.py:1082 virtualbricks/brickfactory.py:1144 #: virtualbricks/brickfactory.py:1149 virtualbricks/brickfactory.py:1151 #: virtualbricks/brickfactory.py:1888 virtualbricks/brickfactory.py:1940 msgid "disconnected" msgstr "disconnesso" #: virtualbricks/brickfactory.py:718 virtualbricks/brickfactory.py:775 #: virtualbricks/brickfactory.py:781 virtualbricks/brickfactory.py:838 msgid "off" msgstr "spento" #: virtualbricks/brickfactory.py:773 virtualbricks/brickfactory.py:836 msgid "unconfigured" msgstr "non configurato" #: virtualbricks/brickfactory.py:798 virtualbricks/brickfactory.py:861 msgid "Error: config line must contain add OR addsh." msgstr "Errore: la riga di configurazione deve contenere add oppure addsh." #: virtualbricks/brickfactory.py:806 virtualbricks/brickfactory.py:869 #, python-format msgid "Added vb-shell command: '%s'" msgstr "Aggiunto un comando vb-shell: '%s'" #: virtualbricks/brickfactory.py:813 virtualbricks/brickfactory.py:876 #, python-format msgid "Added host-shell command: '%s'" msgstr "Aggiunto un comando host-shell: '%s'" #: virtualbricks/brickfactory.py:956 virtualbricks/brickfactory.py:1019 msgid "Ports:" msgstr "Porte:" #: virtualbricks/brickfactory.py:1017 virtualbricks/brickfactory.py:1080 #, python-format msgid "plugged to %s " msgstr "connesso a %s" #: virtualbricks/brickfactory.py:1089 virtualbricks/brickfactory.py:1152 msgid "Configured to connect" msgstr "Configurato per connettere" #: virtualbricks/brickfactory.py:1091 virtualbricks/brickfactory.py:1154 msgid "Not yet configured." msgstr "Non ancora configurato." #: virtualbricks/brickfactory.py:1092 virtualbricks/brickfactory.py:1155 msgid "Left plug is" msgstr "Il plug sinistro è" #: virtualbricks/brickfactory.py:1092 virtualbricks/brickfactory.py:1155 msgid "and right plug is" msgstr "e il plug destro è" #: virtualbricks/brickfactory.py:1823 virtualbricks/brickfactory.py:1874 #: virtualbricks/brickfactory.py:1886 virtualbricks/brickfactory.py:1937 msgid "plugged to" msgstr "connesso a" #: virtualbricks/brickfactory.py:1824 virtualbricks/brickfactory.py:1887 msgid "listening to udp:" msgstr "in ascolto su udp:" #: virtualbricks/brickfactory.py:1875 virtualbricks/brickfactory.py:1938 msgid ", connecting to udp://" msgstr ", connessione a udp://" #: virtualbricks/brickfactory.py:2146 virtualbricks/brickfactory.py:2209 msgid "command:" msgstr "comando:" #: virtualbricks/brickfactory.py:2781 virtualbricks/brickfactory.py:2857 msgid "Engine: Bye!" msgstr "Motore: Arrivederci!" #: virtualbricks/gui/gui.py:107 msgid "PID" msgstr "PID" #: virtualbricks/gui/gui.py:107 virtualbricks/gui/gui.py:109 #: virtualbricks/gui/gui.py:199 virtualbricks/gui/gui.py:221 #: virtualbricks/gui/gui.py:1138 virtualbricks/gui/gui.py:1160 #: virtualbricks/gui/gui.py:2754 virtualbricks/gui/gui.py:2776 #: virtualbricks/gui/gui.py:2761 virtualbricks/gui/gui.py:2783 #: virtualbricks/gui/gui.py:1140 virtualbricks/gui/gui.py:1162 #: virtualbricks/gui/gui.py:2763 virtualbricks/gui/gui.py:2785 #: virtualbricks/gui/gui.py:2765 virtualbricks/gui/gui.py:2787 #: virtualbricks/gui/gui.py:2746 virtualbricks/gui/gui.py:2768 #: virtualbricks/gui/gui.py:2739 msgid "Type" msgstr "Tipo" #: virtualbricks/gui/gui.py:107 virtualbricks/gui/gui.py:109 #: virtualbricks/gui/gui.py:204 virtualbricks/gui/gui.py:223 #: virtualbricks/gui/gui.py:1140 virtualbricks/gui/gui.py:1162 #: virtualbricks/gui/gui.py:2756 virtualbricks/gui/gui.py:2778 #: virtualbricks/gui/gui.py:2763 virtualbricks/gui/gui.py:2785 #: virtualbricks/gui/gui.py:1142 virtualbricks/gui/gui.py:1164 #: virtualbricks/gui/gui.py:2765 virtualbricks/gui/gui.py:2787 #: virtualbricks/gui/gui.py:2767 virtualbricks/gui/gui.py:2789 #: virtualbricks/gui/gui.py:2748 virtualbricks/gui/gui.py:2770 #: virtualbricks/gui/gui.py:2741 msgid "Name" msgstr "Nome" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:119 #: virtualbricks/gui/gui.py:132 virtualbricks/gui/gui.py:181 #: virtualbricks/gui/gui.py:214 virtualbricks/gui/gui.py:1136 #: virtualbricks/gui/gui.py:1158 virtualbricks/gui/gui.py:2752 #: virtualbricks/gui/gui.py:2774 virtualbricks/gui/gui.py:2759 #: virtualbricks/gui/gui.py:2781 virtualbricks/gui/gui.py:1138 #: virtualbricks/gui/gui.py:1160 virtualbricks/gui/gui.py:2761 #: virtualbricks/gui/gui.py:2783 virtualbricks/gui/gui.py:2763 #: virtualbricks/gui/gui.py:2785 virtualbricks/gui/gui.py:2744 #: virtualbricks/gui/gui.py:2766 virtualbricks/gui/gui.py:2737 msgid "Icon" msgstr "Icona" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:197 #: virtualbricks/gui/gui.py:219 msgid "Status" msgstr "Stato" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:206 #: virtualbricks/gui/gui.py:225 virtualbricks/gui/gui.py:1142 #: virtualbricks/gui/gui.py:1164 virtualbricks/gui/gui.py:2758 #: virtualbricks/gui/gui.py:2780 virtualbricks/gui/gui.py:2765 #: virtualbricks/gui/gui.py:2787 virtualbricks/gui/gui.py:1144 #: virtualbricks/gui/gui.py:1166 virtualbricks/gui/gui.py:2767 #: virtualbricks/gui/gui.py:2789 virtualbricks/gui/gui.py:2769 #: virtualbricks/gui/gui.py:2791 virtualbricks/gui/gui.py:2750 #: virtualbricks/gui/gui.py:2772 virtualbricks/gui/gui.py:2743 msgid "Parameters" msgstr "Parametri" #: virtualbricks/gui/gui.py:115 msgid "Address" msgstr "" #: virtualbricks/gui/gui.py:115 msgid "Autoconnect" msgstr "" #: virtualbricks/gui/gui.py:332 virtualbricks/gui/gui.py:1091 #: virtualbricks/gui/gui.py:1093 msgid "Command" msgstr "Comando" #: virtualbricks/gui/gui.py:336 virtualbricks/gui/gui.py:1095 #: virtualbricks/gui/gui.py:1097 msgid "Host shell command" msgstr "Comando della shell Host" #: virtualbricks/gui/gui.py:443 msgid "KVM is disabled from Properties" msgstr "KVM è disabilitato nelle Impostazioni" #: virtualbricks/gui/gui.py:729 msgid "Show Settings" msgstr "Mostra Impostazioni" #: virtualbricks/gui/gui.py:755 virtualbricks/gui/gui.py:792 msgid "Hide Settings" msgstr "Nascondi Impostazioni" #: virtualbricks/gui/gui.py:1038 virtualbricks/gui/gui.py:1045 #: virtualbricks/gui/gui.py:1040 virtualbricks/gui/gui.py:1047 msgid "Cannot create brick: Invalid name." msgstr "Impossibile creare mattone: nome non valido." #: virtualbricks/gui/gui.py:1062 virtualbricks/gui/gui.py:1066 #: virtualbricks/gui/gui.py:1064 virtualbricks/gui/gui.py:1068 msgid "The name \"" msgstr "Il nome \"" #: virtualbricks/gui/gui.py:1062 virtualbricks/gui/gui.py:1064 msgid "\" has forbidden format." msgstr "\" ha un formato proibito." #: virtualbricks/gui/gui.py:1066 virtualbricks/gui/gui.py:1068 msgid "\" has been adapted to \"" msgstr "\" è stato adattato a \"" #: virtualbricks/gui/gui.py:1070 virtualbricks/gui/gui.py:1072 msgid "An event named \"" msgstr "Un evento di nome \"" #: virtualbricks/gui/gui.py:1070 virtualbricks/gui/gui.py:1072 msgid "\" already exist." msgstr "\" esiste già." #: virtualbricks/gui/gui.py:1174 virtualbricks/gui/gui.py:1176 msgid "Bricks to add to the event to be started" msgstr "Mattoni da aggiungere all'evento per essere avviati" #: virtualbricks/gui/gui.py:1178 virtualbricks/gui/gui.py:1180 msgid "Bricks to add to the event to be stopped" msgstr "Mattoni da aggiungere all'evento per essere fermati" #: virtualbricks/gui/gui.py:1182 virtualbricks/gui/gui.py:1184 msgid "Events to add to the event to be started" msgstr "Eventi da aggiungere all'evento per essere avviati" #: virtualbricks/gui/gui.py:1187 virtualbricks/gui/gui.py:1189 msgid "Cannot create event: Invalid name." msgstr "Impossibile creare evento: nome non valido." #: virtualbricks/gui/gui.py:1311 virtualbricks/gui/gui.py:1313 msgid "Help for parameter:" msgstr "" #: virtualbricks/gui/gui.py:1316 #, python-format msgid "" "\t\tCHANNEL BANDWIDTH\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1320 virtualbricks/gui/gui.py:1327 #, python-format msgid "" "\t\tINTERFACE SPEED\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1331 virtualbricks/gui/gui.py:1338 #, python-format msgid "" "\t\tDELAY\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1342 virtualbricks/gui/gui.py:1349 #, python-format msgid "" "\t\tCHANNEL BUFFER SIZE\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1352 virtualbricks/gui/gui.py:1359 #, python-format msgid "" "\t\tPACKET LOSS\n" "Percentage of loss as a floating point number.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1361 virtualbricks/gui/gui.py:1368 #, python-format msgid "" "\t\tPACKET DUPLICATION\n" "Percentage of dup packet. Do not use dup factor 100%% because it means that " "each packet is sent infinite times.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1371 virtualbricks/gui/gui.py:1378 #, python-format msgid "" "\t\tNOISE\n" "Number of bits damaged/one megabyte (megabit).\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1380 virtualbricks/gui/gui.py:1387 #, python-format msgid "" "\t\tLOST BURST\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1390 virtualbricks/gui/gui.py:1397 msgid "" "\t\tMTU: MAXIMUM TRANSMISSION UNIT\n" "Packets longer than specified size are discarded." msgstr "" #: virtualbricks/gui/gui.py:1614 virtualbricks/gui/gui.py:1621 #: virtualbricks/gui/gui.py:1623 virtualbricks/gui/gui.py:1625 #: virtualbricks/gui/gui.py:1606 virtualbricks/gui/gui.py:1599 #, python-format msgid "Cannot start '%s': not configured" msgstr "Impossibile avviare '%s': non configurato" #: virtualbricks/gui/gui.py:1619 virtualbricks/gui/gui.py:1626 #: virtualbricks/gui/gui.py:1628 virtualbricks/gui/gui.py:1630 #: virtualbricks/gui/gui.py:1611 virtualbricks/gui/gui.py:1604 #, python-format msgid "Cannot start '%s': not connected" msgstr "Impossibile avviare '%s': non connesso" #: virtualbricks/gui/gui.py:1625 virtualbricks/gui/gui.py:1632 #: virtualbricks/gui/gui.py:1634 virtualbricks/gui/gui.py:1636 #: virtualbricks/gui/gui.py:1617 virtualbricks/gui/gui.py:1610 msgid "" "Loop link detected: aborting operation. If you want to start a looped " "network, disable the check loop feature in the general settings" msgstr "" "Loop di collegamento rilevato: annullamento delle operazioni. Se vuoi " "avviare una rete con loop, modifica la configurazione nelle impostazioni " "generali" #: virtualbricks/gui/gui.py:1633 virtualbricks/gui/gui.py:1640 #: virtualbricks/gui/gui.py:1642 virtualbricks/gui/gui.py:1644 #: virtualbricks/gui/gui.py:1625 virtualbricks/gui/gui.py:1618 msgid "Disk used by the VM is locked by another machine" msgstr "Il disco usato dalla VM è bloccato da un'altra macchina" #: virtualbricks/gui/gui.py:1907 virtualbricks/gui/gui.py:1914 #: virtualbricks/gui/gui.py:1916 virtualbricks/gui/gui.py:1918 #: virtualbricks/gui/gui.py:1899 virtualbricks/gui/gui.py:1892 msgid "Choose a filename first!" msgstr "Scegliere prima un nome di file!" #: virtualbricks/gui/gui.py:2096 virtualbricks/gui/gui.py:2103 #: virtualbricks/gui/gui.py:2105 virtualbricks/gui/gui.py:2107 #: virtualbricks/gui/gui.py:2088 virtualbricks/gui/gui.py:2081 msgid "No KVM binary found" msgstr "Binari KVM non trovati" #: virtualbricks/gui/gui.py:2096 virtualbricks/gui/gui.py:2099 #: virtualbricks/gui/gui.py:2103 virtualbricks/gui/gui.py:2106 #: virtualbricks/gui/gui.py:2105 virtualbricks/gui/gui.py:2108 #: virtualbricks/gui/gui.py:2107 virtualbricks/gui/gui.py:2110 #: virtualbricks/gui/gui.py:2088 virtualbricks/gui/gui.py:2091 #: virtualbricks/gui/gui.py:2081 virtualbricks/gui/gui.py:2084 msgid "Check your active configuration" msgstr "Controlla la configurazione attiva" #: virtualbricks/gui/gui.py:2096 virtualbricks/gui/gui.py:2099 #: virtualbricks/gui/gui.py:2103 virtualbricks/gui/gui.py:2106 #: virtualbricks/gui/gui.py:2105 virtualbricks/gui/gui.py:2108 #: virtualbricks/gui/gui.py:2107 virtualbricks/gui/gui.py:2110 #: virtualbricks/gui/gui.py:2088 virtualbricks/gui/gui.py:2091 #: virtualbricks/gui/gui.py:2081 virtualbricks/gui/gui.py:2084 msgid "KVM will stay disabled" msgstr "KVM rimmarrà disabilitato" #: virtualbricks/gui/gui.py:2099 virtualbricks/gui/gui.py:2106 #: virtualbricks/gui/gui.py:2108 virtualbricks/gui/gui.py:2110 #: virtualbricks/gui/gui.py:2091 virtualbricks/gui/gui.py:2084 msgid "No KVM support found on the system" msgstr "Nessun supporto KVM trovato nel sistema" #: virtualbricks/gui/gui.py:2107 virtualbricks/gui/gui.py:2114 #: virtualbricks/gui/gui.py:2116 virtualbricks/gui/gui.py:2118 #: virtualbricks/gui/gui.py:2099 virtualbricks/gui/gui.py:2092 msgid "No KSM support found on the system" msgstr "Nessun supporto KSM trovato nel sistema" #: virtualbricks/gui/gui.py:2107 virtualbricks/gui/gui.py:2114 #: virtualbricks/gui/gui.py:2116 virtualbricks/gui/gui.py:2118 #: virtualbricks/gui/gui.py:2099 virtualbricks/gui/gui.py:2092 msgid "Check your configuration" msgstr "Controlla la configurazione" #: virtualbricks/gui/gui.py:2107 virtualbricks/gui/gui.py:2114 #: virtualbricks/gui/gui.py:2116 virtualbricks/gui/gui.py:2118 #: virtualbricks/gui/gui.py:2099 virtualbricks/gui/gui.py:2092 msgid "KSM will stay disabled" msgstr "KSM rimarrà disabilitato" #: virtualbricks/gui/gui.py:2121 virtualbricks/gui/gui.py:2128 #: virtualbricks/gui/gui.py:2130 virtualbricks/gui/gui.py:2132 #: virtualbricks/gui/gui.py:2113 virtualbricks/gui/gui.py:2106 msgid "The brick is still running, it will be killed before being deleted!\n" msgstr "" "Il mattone è ancora in esecuzione, sarà arrestato prima di essere " "cancellato!\n" #: virtualbricks/gui/gui.py:2123 virtualbricks/gui/gui.py:2130 #: virtualbricks/gui/gui.py:2132 virtualbricks/gui/gui.py:2134 #: virtualbricks/gui/gui.py:2115 virtualbricks/gui/gui.py:2108 msgid "Do you really want to delete " msgstr "Si vuole veramente cancellare " #: virtualbricks/gui/gui.py:2132 virtualbricks/gui/gui.py:2139 #: virtualbricks/gui/gui.py:2141 virtualbricks/gui/gui.py:2143 #: virtualbricks/gui/gui.py:2124 virtualbricks/gui/gui.py:2117 msgid "This event is in use" msgstr "Questo evento è in uso" #: virtualbricks/gui/gui.py:2134 virtualbricks/gui/gui.py:2141 #: virtualbricks/gui/gui.py:2143 virtualbricks/gui/gui.py:2145 #: virtualbricks/gui/gui.py:2126 virtualbricks/gui/gui.py:2119 msgid "Do you really want to delete" msgstr "Vuoi davvero cancellare" #: virtualbricks/gui/gui.py:2144 virtualbricks/gui/gui.py:2151 #: virtualbricks/gui/gui.py:2153 virtualbricks/gui/gui.py:2155 #: virtualbricks/gui/gui.py:2136 virtualbricks/gui/gui.py:2129 msgid "Cannot rename Brick: it is in use." msgstr "Impossibile rinominare Mattone: è in uso." #: virtualbricks/gui/gui.py:2170 virtualbricks/gui/gui.py:2182 #: virtualbricks/gui/gui.py:2241 virtualbricks/gui/gui.py:2177 #: virtualbricks/gui/gui.py:2189 virtualbricks/gui/gui.py:2248 #: virtualbricks/gui/gui.py:2179 virtualbricks/gui/gui.py:2191 #: virtualbricks/gui/gui.py:2250 virtualbricks/gui/gui.py:2181 #: virtualbricks/gui/gui.py:2193 virtualbricks/gui/gui.py:2252 #: virtualbricks/gui/gui.py:2162 virtualbricks/gui/gui.py:2174 #: virtualbricks/gui/gui.py:2233 virtualbricks/gui/gui.py:2155 #: virtualbricks/gui/gui.py:2167 virtualbricks/gui/gui.py:2226 msgid "Invalid name!" msgstr "Nome invalido!" #: virtualbricks/gui/gui.py:2176 virtualbricks/gui/gui.py:2183 #: virtualbricks/gui/gui.py:2185 virtualbricks/gui/gui.py:2187 #: virtualbricks/gui/gui.py:2168 virtualbricks/gui/gui.py:2161 msgid "Cannot rename Event: it is in use." msgstr "Impossibile rinominare Evento: è in uso." #: virtualbricks/gui/gui.py:2287 virtualbricks/gui/gui.py:2296 #: virtualbricks/gui/gui.py:2326 virtualbricks/gui/gui.py:2294 #: virtualbricks/gui/gui.py:2303 virtualbricks/gui/gui.py:2333 #: virtualbricks/gui/gui.py:2305 virtualbricks/gui/gui.py:2335 #: virtualbricks/gui/gui.py:2298 virtualbricks/gui/gui.py:2307 #: virtualbricks/gui/gui.py:2337 virtualbricks/gui/gui.py:2279 #: virtualbricks/gui/gui.py:2288 virtualbricks/gui/gui.py:2318 #: virtualbricks/gui/gui.py:2272 virtualbricks/gui/gui.py:2281 #: virtualbricks/gui/gui.py:2311 msgid "Error" msgstr "Errore" #: virtualbricks/gui/gui.py:2287 virtualbricks/gui/gui.py:2294 #: virtualbricks/gui/gui.py:2296 virtualbricks/gui/gui.py:2298 #: virtualbricks/gui/gui.py:2279 virtualbricks/gui/gui.py:2272 msgid "invalid path for qemu binaries" msgstr "percorso non valido per i binari di qemu" #: virtualbricks/gui/gui.py:2296 virtualbricks/gui/gui.py:2303 #: virtualbricks/gui/gui.py:2305 virtualbricks/gui/gui.py:2307 #: virtualbricks/gui/gui.py:2288 virtualbricks/gui/gui.py:2281 msgid "cannot find neither qemu nor kvm in this path" msgstr "né qemu né kvm sono stati trovati in questo percorso" #: virtualbricks/gui/gui.py:2300 virtualbricks/gui/gui.py:2303 #: virtualbricks/gui/gui.py:2307 virtualbricks/gui/gui.py:2310 #: virtualbricks/gui/gui.py:2309 virtualbricks/gui/gui.py:2312 #: virtualbricks/gui/gui.py:2311 virtualbricks/gui/gui.py:2314 #: virtualbricks/gui/gui.py:2292 virtualbricks/gui/gui.py:2295 #: virtualbricks/gui/gui.py:2285 virtualbricks/gui/gui.py:2288 msgid "Warning" msgstr "Attenzione" #: virtualbricks/gui/gui.py:2300 virtualbricks/gui/gui.py:2307 #: virtualbricks/gui/gui.py:2309 virtualbricks/gui/gui.py:2311 #: virtualbricks/gui/gui.py:2292 virtualbricks/gui/gui.py:2285 msgid "cannot find qemu, using kvm only\n" msgstr "non trovo qemu, uso solo kvm\n" #: virtualbricks/gui/gui.py:2303 virtualbricks/gui/gui.py:2310 #: virtualbricks/gui/gui.py:2312 virtualbricks/gui/gui.py:2314 #: virtualbricks/gui/gui.py:2295 virtualbricks/gui/gui.py:2288 msgid "kvm not found" msgstr "kvm non trovato" #: virtualbricks/gui/gui.py:2303 virtualbricks/gui/gui.py:2310 #: virtualbricks/gui/gui.py:2312 virtualbricks/gui/gui.py:2314 #: virtualbricks/gui/gui.py:2295 virtualbricks/gui/gui.py:2288 msgid "KVM support disabled" msgstr "Supporto KVM disabilitato" #: virtualbricks/gui/gui.py:2305 virtualbricks/gui/gui.py:2312 #: virtualbricks/gui/gui.py:2314 virtualbricks/gui/gui.py:2316 #: virtualbricks/gui/gui.py:2297 virtualbricks/gui/gui.py:2290 msgid "KVM and Qemu detected" msgstr "KVM e Qemu rilevati" #: virtualbricks/gui/gui.py:2317 virtualbricks/gui/gui.py:2324 #: virtualbricks/gui/gui.py:2326 virtualbricks/gui/gui.py:2328 #: virtualbricks/gui/gui.py:2309 virtualbricks/gui/gui.py:2302 msgid "additional targets supported" msgstr "altri target supportati" #: virtualbricks/gui/gui.py:2326 virtualbricks/gui/gui.py:2333 #: virtualbricks/gui/gui.py:2335 virtualbricks/gui/gui.py:2337 #: virtualbricks/gui/gui.py:2318 virtualbricks/gui/gui.py:2311 msgid "invalid path for vde binaries" msgstr "percorso non valido per i binari di vde" #: virtualbricks/gui/gui.py:2328 virtualbricks/gui/gui.py:2335 #: virtualbricks/gui/gui.py:2337 virtualbricks/gui/gui.py:2339 #: virtualbricks/gui/gui.py:2320 virtualbricks/gui/gui.py:2313 msgid "Warning, missing modules" msgstr "Attenzione, moduli mancanti" #: virtualbricks/gui/gui.py:2333 virtualbricks/gui/gui.py:2340 #: virtualbricks/gui/gui.py:2342 virtualbricks/gui/gui.py:2344 #: virtualbricks/gui/gui.py:2325 virtualbricks/gui/gui.py:2318 msgid "All VDE components detected" msgstr "Tutti i componenti VDE rilevati" #: virtualbricks/gui/gui.py:2399 virtualbricks/gui/gui.py:2406 #: virtualbricks/gui/gui.py:2408 virtualbricks/gui/gui.py:2410 #: virtualbricks/gui/gui.py:2391 virtualbricks/gui/gui.py:2384 msgid "" "No KVM binary found. Check your active configuration. KVM will stay disabled." msgstr "" "Binari di KVM non trovati. Controlla la configurazione attiva. KVM rimarrà " "disabilitato." #: virtualbricks/gui/gui.py:2402 virtualbricks/gui/gui.py:2409 #: virtualbricks/gui/gui.py:2411 virtualbricks/gui/gui.py:2413 #: virtualbricks/gui/gui.py:2394 virtualbricks/gui/gui.py:2387 msgid "" "No KVM support found on the system. Check your active configuration. KVM " "will stay disabled." msgstr "" "Supporto a KVM non trovato nel sistema. Controlla la configurazione attiva. " "KVM rimarrà disabilitato." #: virtualbricks/gui/gui.py:2573 virtualbricks/gui/gui.py:2580 #: virtualbricks/gui/gui.py:2582 virtualbricks/gui/gui.py:2584 #: virtualbricks/gui/gui.py:2565 virtualbricks/gui/gui.py:2558 msgid "Suspend/Resume not supported on this disk." msgstr "Sospensione/Ripristino non supportato su questo disco." #: virtualbricks/gui/gui.py:2598 virtualbricks/gui/gui.py:2605 #: virtualbricks/gui/gui.py:2607 virtualbricks/gui/gui.py:2609 #: virtualbricks/gui/gui.py:2590 virtualbricks/gui/gui.py:2583 msgid "Cannot find suspend point." msgstr "Impossibile trovare punto di sospensione." #: virtualbricks/gui/gui.py:2630 virtualbricks/gui/gui.py:2637 #: virtualbricks/gui/gui.py:2639 virtualbricks/gui/gui.py:2641 #: virtualbricks/gui/gui.py:2622 virtualbricks/gui/gui.py:2615 msgid "Error saving topology: Invalid image format" msgstr "Errore nel salvataggio della topologia: formato file non valido" #: virtualbricks/gui/gui.py:2632 virtualbricks/gui/gui.py:2639 #: virtualbricks/gui/gui.py:2641 virtualbricks/gui/gui.py:2643 #: virtualbricks/gui/gui.py:2624 virtualbricks/gui/gui.py:2617 msgid "Error saving topology: Could not write file" msgstr "Errore nel salvataggio della topologia: impossibile scrivere sul file" #: virtualbricks/gui/gui.py:2634 virtualbricks/gui/gui.py:2641 #: virtualbricks/gui/gui.py:2643 virtualbricks/gui/gui.py:2645 #: virtualbricks/gui/gui.py:2626 virtualbricks/gui/gui.py:2619 msgid "Error saving topology: Unknown error" msgstr "Errore nel salvataggio della topologia: errore sconosciuto" #: virtualbricks/gui/gui.py:2789 virtualbricks/gui/gui.py:2796 #: virtualbricks/gui/gui.py:2798 virtualbricks/gui/gui.py:2800 #: virtualbricks/gui/gui.py:2781 virtualbricks/gui/gui.py:2774 msgid "Virtualbricks-Events to attach to the start/stop Brick Events" msgstr "" "Eventi di Virtualbricks da agganciare all'evento di avvio/arresto del Mattone" #: virtualbricks/gui/gui.py:2795 virtualbricks/gui/gui.py:2802 #: virtualbricks/gui/gui.py:2804 virtualbricks/gui/gui.py:2806 #: virtualbricks/gui/gui.py:2787 virtualbricks/gui/gui.py:2780 msgid "Save current project?" msgstr "Salvare il progetto corrente?" #: virtualbricks/gui/gui.py:2798 virtualbricks/gui/gui.py:2805 #: virtualbricks/gui/gui.py:2807 virtualbricks/gui/gui.py:2809 #: virtualbricks/gui/gui.py:2790 virtualbricks/gui/gui.py:2783 msgid "Open a project" msgstr "Apertura progetto" #: virtualbricks/gui/gui.py:2801 virtualbricks/gui/gui.py:2821 #: virtualbricks/gui/gui.py:2851 virtualbricks/gui/gui.py:2808 #: virtualbricks/gui/gui.py:2828 virtualbricks/gui/gui.py:2858 #: virtualbricks/gui/gui.py:2810 virtualbricks/gui/gui.py:2830 #: virtualbricks/gui/gui.py:2860 virtualbricks/gui/gui.py:2812 #: virtualbricks/gui/gui.py:2832 virtualbricks/gui/gui.py:2862 #: virtualbricks/gui/gui.py:2793 virtualbricks/gui/gui.py:2813 #: virtualbricks/gui/gui.py:2843 virtualbricks/gui/gui.py:2786 #: virtualbricks/gui/gui.py:2806 virtualbricks/gui/gui.py:2836 msgid "Virtualbricks Bricks List" msgstr "Lista Mattoni di Virtualbricks" #: virtualbricks/gui/gui.py:2805 virtualbricks/gui/gui.py:2825 #: virtualbricks/gui/gui.py:2855 virtualbricks/gui/gui.py:2812 #: virtualbricks/gui/gui.py:2832 virtualbricks/gui/gui.py:2862 #: virtualbricks/gui/gui.py:2814 virtualbricks/gui/gui.py:2834 #: virtualbricks/gui/gui.py:2864 virtualbricks/gui/gui.py:2816 #: virtualbricks/gui/gui.py:2836 virtualbricks/gui/gui.py:2866 #: virtualbricks/gui/gui.py:2797 virtualbricks/gui/gui.py:2817 #: virtualbricks/gui/gui.py:2847 virtualbricks/gui/gui.py:2790 #: virtualbricks/gui/gui.py:2810 virtualbricks/gui/gui.py:2840 msgid "All files" msgstr "Tutti i file" #: virtualbricks/gui/gui.py:2817 virtualbricks/gui/gui.py:2824 #: virtualbricks/gui/gui.py:2826 virtualbricks/gui/gui.py:2828 #: virtualbricks/gui/gui.py:2809 virtualbricks/gui/gui.py:2802 msgid "Save as..." msgstr "Salva come..." #: virtualbricks/gui/gui.py:2847 virtualbricks/gui/gui.py:2854 #: virtualbricks/gui/gui.py:2856 virtualbricks/gui/gui.py:2858 #: virtualbricks/gui/gui.py:2839 virtualbricks/gui/gui.py:2832 msgid "New project" msgstr "Nuovo progetto" #: virtualbricks/settings.py:86 #, python-format msgid "Configuration loaded ('%s')" msgstr "Configurazione caricata ('%s')" #: virtualbricks/settings.py:88 msgid "Cannot read config file " msgstr "Impossibile leggere il file di configurazione " #: virtualbricks/settings.py:90 msgid "Default configuration loaded" msgstr "Caricata configurazione di default" #: virtualbricks/settings.py:94 #, python-format msgid "Default configuration saved ('%s')" msgstr "Salvata configurazione di default ('%s')" #: virtualbricks/settings.py:97 msgid "Cannot save default configuration" msgstr "Impossibile salvare la configurazione di default" #: share/virtualbricks.template.glade:1833 msgid "Number of CPUs:" msgstr "" #: virtualbricks/brickfactory.py:641 msgid "can not stop brick error code:" msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1329 #, python-format msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1340 #, python-format msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1351 #, python-format msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1361 virtualbricks/gui/gui.py:1363 #, python-format msgid "" "\t\t\tPACKET LOSS\n" "\n" "Percentage of loss as a floating point number.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1370 virtualbricks/gui/gui.py:1372 msgid "" "\t\t\tPACKET DUPLICATION\n" "\n" "Percentage of dup packet. Do not use dup factor 100% because it means that " "each packet is sent infinite times.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1380 virtualbricks/gui/gui.py:1382 #, python-format msgid "" "\t\t\tNOISE\n" "\n" "Number of bits damaged/one megabyte (megabit).\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1389 virtualbricks/gui/gui.py:1391 #, python-format msgid "" "\t\t\tLOST BURST\n" "\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1399 virtualbricks/gui/gui.py:1401 #: virtualbricks/gui/gui.py:1382 virtualbricks/gui/gui.py:1375 msgid "" "\t\t\tMTU: MAXIMUM TRANSMISSION UNIT\n" "\n" "Packets longer than specified size are discarded." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1329 virtualbricks/gui/gui.py:1331 #, python-format msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1340 virtualbricks/gui/gui.py:1342 #, python-format msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1351 virtualbricks/gui/gui.py:1353 #, python-format msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10\\% for a base value " "of 100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98\\% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10\\u0025 for a base " "value of 100 means the final value goes from 90 to 110. The distribution can " "be Uniform or Gaussian normal (more than 98\\% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1317 #, python-format msgid "" "Jitter 10% for a base value of 100 means the final value goes from 90 to " "110. The distribution can be Uniform or Gaussian normal (more than 98% of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1323 virtualbricks/gui/gui.py:1325 msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1317 #, python-format msgid "" "Jitter 10%% for a base value of 100 means the final value goes from 90 to " "110. The distribution can be Uniform or Gaussian normal (more than 98%% of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "Jitter 10 percent for a base value of 100 means the final value goes from 90 " "to 110. The distribution can be Uniform or Gaussian normal (more than 98% of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1333 msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1341 msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1349 msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1356 msgid "" "\t\t\tPACKET LOSS\n" "\n" "Percentage of loss as a floating point number.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1362 msgid "" "\t\t\tPACKET DUPLICATION\n" "\n" "Percentage of dup packet. Do not use dup factor 100% because it means that " "each packet is sent infinite times.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1369 msgid "" "\t\t\tNOISE\n" "\n" "Number of bits damaged/one megabyte (megabit).\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1375 msgid "" "\t\t\tLOST BURST\n" "\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "Jitter 10 %% percent for a base value of 100 means the final value goes from " "90 to 110. The distribution can be Uniform or Gaussian normal (more than " "98% of the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 msgid "" "Jitter 10 % percent for a base value of 100 means the final value goes from " "90 to 110. The distribution can be Uniform or Gaussian normal (more than 98% " "of the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "Jitter 10 % for a base value of 100 means the final value goes from 90 to " "110. The distribution can be Uniform or Gaussian normal (more than 98 % of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "Jitter 10 %% for a base value of 100 means the final value goes from 90 to " "110. The distribution can be Uniform or Gaussian normal (more than 98 %% of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\n" "Jitter is the variation from the base value. Jitter 10 percent for a base " "value of 100 means the final value goes from 90 to 110. The distribution can " "be Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1326 msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path)." msgstr "" #: virtualbricks/gui/gui.py:1333 msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth." msgstr "" #: virtualbricks/gui/gui.py:1340 msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay." msgstr "" #: virtualbricks/gui/gui.py:1347 msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded." msgstr "" #: virtualbricks/gui/gui.py:1353 msgid "" "\t\t\tPACKET LOSS\n" "\n" "Percentage of loss as a floating point number." msgstr "" #: virtualbricks/gui/gui.py:1358 msgid "" "\t\t\tPACKET DUPLICATION\n" "\n" "Percentage of dup packet. Do not use dup factor 100% because it means that " "each packet is sent infinite times." msgstr "" #: virtualbricks/gui/gui.py:1364 msgid "" "\t\t\tNOISE\n" "\n" "Number of bits damaged/one megabyte (megabit)." msgstr "" #: virtualbricks/gui/gui.py:1369 msgid "" "\t\t\tLOST BURST\n" "\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts." msgstr "" virtualbricks-1.0.2/locale/virtualbricks/nl.po000066400000000000000000003244251262207653100215100ustar00rootroot00000000000000# 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 , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: virtualbricks 0.4\n" "Report-Msgid-Bugs-To: qemulator-list@createweb.de\n" "POT-Creation-Date: 2011-06-01 22:47+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: share/virtualbricks.template.glade:10 msgid "Virtualbricks" msgstr "" #: share/virtualbricks.template.glade:27 msgid "_File" msgstr "" #: share/virtualbricks.template.glade:33 msgid "_Open Project" msgstr "" #: share/virtualbricks.template.glade:48 msgid "_Recent Projects..." msgstr "" #: share/virtualbricks.template.glade:68 msgid "Restart with _empty project" msgstr "" #: share/virtualbricks.template.glade:83 msgid "_Import bricks" msgstr "" #: share/virtualbricks.template.glade:98 msgid "_Save project as..." msgstr "" #: share/virtualbricks.template.glade:132 msgid "_Settings" msgstr "" #: share/virtualbricks.template.glade:140 msgid "configure Virtualbricks" msgstr "" #: share/virtualbricks.template.glade:150 msgid "auto show empty settings" msgstr "" #: share/virtualbricks.template.glade:159 msgid "auto hide stored settings" msgstr "" #: share/virtualbricks.template.glade:171 msgid "_View" msgstr "" #: share/virtualbricks.template.glade:179 msgid "_Messages" msgstr "" #: share/virtualbricks.template.glade:191 msgid "_Image creation" msgstr "" #: share/virtualbricks.template.glade:198 msgid "Not implemented yet" msgstr "" #: share/virtualbricks.template.glade:199 msgid "_Create new image" msgstr "" #: share/virtualbricks.template.glade:211 msgid "_Help" msgstr "" #: share/virtualbricks.template.glade:218 msgid "About Virtualbricks and QEMU" msgstr "" #: share/virtualbricks.template.glade:219 msgid "_About" msgstr "" #: share/virtualbricks.template.glade:271 msgid "Bricks:" msgstr "" #: share/virtualbricks.template.glade:298 msgid "New Brick" msgstr "" #: share/virtualbricks.template.glade:320 msgid "Start All Bricks" msgstr "" #: share/virtualbricks.template.glade:334 msgid "Stop All Bricks" msgstr "" #: share/virtualbricks.template.glade:361 msgid "" "You can use drag and drop to connect bricks and double click to start/stop " "them." msgstr "" #: share/virtualbricks.template.glade:378 virtualbricks/gui/gui.py:115 msgid "Bricks" msgstr "" #: share/virtualbricks.template.glade:396 msgid "New Event" msgstr "" #: share/virtualbricks.template.glade:418 msgid "Start All Events" msgstr "" #: share/virtualbricks.template.glade:432 msgid "Stop All Events" msgstr "" #: share/virtualbricks.template.glade:459 msgid "" "You can use drag and drop to add an event to events collation and double " "click to start/stop them." msgstr "" #: share/virtualbricks.template.glade:477 msgid "Events" msgstr "" #: share/virtualbricks.template.glade:494 msgid "" "Click to select an enty for use or edit its configuration, rightclick for " "more." msgstr "" #: share/virtualbricks.template.glade:508 msgid "Running" msgstr "" #: share/virtualbricks.template.glade:526 msgid "Add host:" msgstr "" #: share/virtualbricks.template.glade:601 msgid "Remote Sessions" msgstr "" #: share/virtualbricks.template.glade:637 msgid "Export as Image" msgstr "" #: share/virtualbricks.template.glade:653 msgid "Expand Horizontally" msgstr "" #: share/virtualbricks.template.glade:668 msgid "Expand Vertically" msgstr "" #: share/virtualbricks.template.glade:725 msgid "Topology" msgstr "" #: share/virtualbricks.template.glade:744 msgid "Show/hide configuration panel for selected boot image" msgstr "" #: share/virtualbricks.template.glade:769 msgid "Show settings" msgstr "" #: share/virtualbricks.template.glade:839 msgid "boot as device" msgstr "" #: share/virtualbricks.template.glade:871 msgid "Snapshot mode" msgstr "" #: share/virtualbricks.template.glade:876 msgid "write to temporary files instead of disk image files" msgstr "" #: share/virtualbricks.template.glade:902 msgid "boot options" msgstr "" #: share/virtualbricks.template.glade:931 msgid "use image as cdrom" msgstr "" #: share/virtualbricks.template.glade:936 msgid "use one of the image files in the default folder as cdrom device" msgstr "" #: share/virtualbricks.template.glade:951 msgid "mount cdrom" msgstr "" #: share/virtualbricks.template.glade:956 msgid "mount local cdrom Drive" msgstr "" #: share/virtualbricks.template.glade:970 msgid "no cdrom" msgstr "" #: share/virtualbricks.template.glade:975 msgid "don´t use any cdrom device" msgstr "" #: share/virtualbricks.template.glade:990 msgid "/dev/cdrom\n" msgstr "" #: share/virtualbricks.template.glade:1062 msgid "cdrom device" msgstr "" #: share/virtualbricks.template.glade:1110 msgid "Select images for Qemu volumes" msgstr "" #: share/virtualbricks.template.glade:1134 #: share/virtualbricks.template.glade:12317 #: share/virtualbricks.template.glade:12354 msgid "fdb" msgstr "" #: share/virtualbricks.template.glade:1148 #: share/virtualbricks.template.glade:12302 #: share/virtualbricks.template.glade:12339 msgid "fda" msgstr "" #: share/virtualbricks.template.glade:1162 msgid "hdd" msgstr "" #: share/virtualbricks.template.glade:1176 msgid "hdc" msgstr "" #: share/virtualbricks.template.glade:1190 msgid "hdb" msgstr "" #: share/virtualbricks.template.glade:1204 msgid "hda" msgstr "" #: share/virtualbricks.template.glade:1315 msgid "mtdblock" msgstr "" #: share/virtualbricks.template.glade:1360 #: share/virtualbricks.template.glade:1401 #: share/virtualbricks.template.glade:1444 #: share/virtualbricks.template.glade:1487 #: share/virtualbricks.template.glade:1530 #: share/virtualbricks.template.glade:1573 #: share/virtualbricks.template.glade:1616 msgid "Private COW" msgstr "" #: share/virtualbricks.template.glade:1648 msgid "additional media" msgstr "" #: share/virtualbricks.template.glade:1685 #: share/virtualbricks.template.glade:12383 #: share/virtualbricks.template.glade:12420 msgid "Drives" msgstr "" #: share/virtualbricks.template.glade:1723 msgid "Architecture: " msgstr "" #: share/virtualbricks.template.glade:1752 #: share/virtualbricks.template.glade:1802 msgid "\n" msgstr "" #: share/virtualbricks.template.glade:1764 msgid "CPU Type" msgstr "" #: share/virtualbricks.template.glade:1776 msgid "" "\n" "\n" msgstr "" #: share/virtualbricks.template.glade:1790 msgid "Machine type" msgstr "" #: share/virtualbricks.template.glade:1813 #: share/virtualbricks.template.glade:1816 msgid "KVM" msgstr "" #: share/virtualbricks.template.glade:1833 #: share/virtualbricks.template.glade:1870 msgid "System and machine" msgstr "" #: share/virtualbricks.template.glade:1891 #: share/virtualbricks.template.glade:1928 msgid "disable graphical output" msgstr "" #: share/virtualbricks.template.glade:1896 #: share/virtualbricks.template.glade:1933 msgid "disable graphical output and redirect serial I/Os to console" msgstr "" #: share/virtualbricks.template.glade:1923 #: share/virtualbricks.template.glade:1960 msgid "Use VGA instead of Default" msgstr "" #: share/virtualbricks.template.glade:1928 #: share/virtualbricks.template.glade:1965 msgid "" "simulate a standard VGA card with VESA Bochs Extensions (default is CL-" "GD5446 PCI VGA)" msgstr "" #: share/virtualbricks.template.glade:1943 #: share/virtualbricks.template.glade:1980 msgid "Start in vncserver" msgstr "" #: share/virtualbricks.template.glade:1948 #: share/virtualbricks.template.glade:1985 msgid "start emulation in a VNC server on display" msgstr "" #: share/virtualbricks.template.glade:1962 #: share/virtualbricks.template.glade:1999 msgid "on Display: " msgstr "" #: share/virtualbricks.template.glade:1974 #: share/virtualbricks.template.glade:2011 msgid "select Dsiplay for VNC server" msgstr "" #: share/virtualbricks.template.glade:1992 #: share/virtualbricks.template.glade:2029 msgid "SDL" msgstr "" #: share/virtualbricks.template.glade:2004 #: share/virtualbricks.template.glade:2041 msgid "Portrait" msgstr "" #: share/virtualbricks.template.glade:2026 #: share/virtualbricks.template.glade:2063 msgid "Display Options" msgstr "" #: share/virtualbricks.template.glade:2055 #: share/virtualbricks.template.glade:2092 msgid "enable usb" msgstr "" #: share/virtualbricks.template.glade:2060 #: share/virtualbricks.template.glade:2097 msgid "enable access to usb" msgstr "" #: share/virtualbricks.template.glade:2091 #: share/virtualbricks.template.glade:2128 msgid "USB settings" msgstr "" #: share/virtualbricks.template.glade:2128 #: share/virtualbricks.template.glade:2165 msgid "Set realtime clock to local time" msgstr "" #: share/virtualbricks.template.glade:2133 #: share/virtualbricks.template.glade:2170 msgid "set the real time clock to local time [default=utc]" msgstr "" #: share/virtualbricks.template.glade:2145 #: share/virtualbricks.template.glade:2182 msgid "Guest time drift compensation (TDF)" msgstr "" #: share/virtualbricks.template.glade:2163 #: share/virtualbricks.template.glade:2200 msgid "Keyboard: " msgstr "" #: share/virtualbricks.template.glade:2193 #: share/virtualbricks.template.glade:2230 msgid "Serial" msgstr "" #: share/virtualbricks.template.glade:2210 #: share/virtualbricks.template.glade:2247 msgid "Extra Settings" msgstr "" #: share/virtualbricks.template.glade:2256 #: share/virtualbricks.template.glade:2293 msgid "select emulated Soundcard " msgstr "" #: share/virtualbricks.template.glade:2284 #: share/virtualbricks.template.glade:2626 #: share/virtualbricks.template.glade:3463 #: share/virtualbricks.template.glade:3484 #: share/virtualbricks.template.glade:10116 #: share/virtualbricks.template.glade:10137 #: share/virtualbricks.template.glade:10289 #: share/virtualbricks.template.glade:10508 #: share/virtualbricks.template.glade:2321 #: share/virtualbricks.template.glade:2663 #: share/virtualbricks.template.glade:3500 #: share/virtualbricks.template.glade:3521 #: share/virtualbricks.template.glade:10153 #: share/virtualbricks.template.glade:10174 #: share/virtualbricks.template.glade:10326 #: share/virtualbricks.template.glade:10545 msgid " \n" msgstr "" #: share/virtualbricks.template.glade:2300 #: share/virtualbricks.template.glade:2337 msgid "Audio Device Settings" msgstr "" #: share/virtualbricks.template.glade:2329 #: share/virtualbricks.template.glade:2366 msgid "Used RAM:" msgstr "" #: share/virtualbricks.template.glade:2355 #: share/virtualbricks.template.glade:2402 #: share/virtualbricks.template.glade:2392 #: share/virtualbricks.template.glade:2439 msgid " MB" msgstr "" #: share/virtualbricks.template.glade:2373 #: share/virtualbricks.template.glade:2410 msgid "KVM Shadow Memory: " msgstr "" #: share/virtualbricks.template.glade:2420 #: share/virtualbricks.template.glade:2457 msgid "Memory Settings" msgstr "" #: share/virtualbricks.template.glade:2481 #: share/virtualbricks.template.glade:2518 msgid "System" msgstr "" #: share/virtualbricks.template.glade:2507 #: share/virtualbricks.template.glade:2544 msgid "Disable networking" msgstr "" #: share/virtualbricks.template.glade:2534 #: share/virtualbricks.template.glade:2571 msgid "No Network" msgstr "" #: share/virtualbricks.template.glade:2561 #: share/virtualbricks.template.glade:2598 msgid "Start with usermode network (default)" msgstr "" #: share/virtualbricks.template.glade:2587 #: share/virtualbricks.template.glade:2624 msgid "Connect to network" msgstr "" #: share/virtualbricks.template.glade:2613 #: share/virtualbricks.template.glade:9901 #: share/virtualbricks.template.glade:2650 #: share/virtualbricks.template.glade:9938 msgid "Connect to:" msgstr "" #: share/virtualbricks.template.glade:2637 #: share/virtualbricks.template.glade:2674 msgid "Virtual ethernet model:" msgstr "" #: share/virtualbricks.template.glade:2648 #: share/virtualbricks.template.glade:2685 msgid "" "\n" "rtl8139\n" "e1000\n" "virtio\n" "i82551\n" "i82557b\n" "i82559er\n" "ne2k_pci\n" "pcnet\n" "ne2k_isa\n" msgstr "" #: share/virtualbricks.template.glade:2668 #: share/virtualbricks.template.glade:2705 msgid "Mac address:" msgstr "" #: share/virtualbricks.template.glade:2689 #: share/virtualbricks.template.glade:2726 msgid "Randomize" msgstr "" #: share/virtualbricks.template.glade:2719 #: share/virtualbricks.template.glade:2756 msgid "Set up a new network card" msgstr "" #: share/virtualbricks.template.glade:2746 #: share/virtualbricks.template.glade:2783 msgid "Add Network card" msgstr "" #: share/virtualbricks.template.glade:2772 #: share/virtualbricks.template.glade:2809 msgid "Edit selected network card or redirection" msgstr "" #: share/virtualbricks.template.glade:2799 #: share/virtualbricks.template.glade:2836 msgid "Edit" msgstr "" #: share/virtualbricks.template.glade:2825 #: share/virtualbricks.template.glade:2862 msgid "Remove selected network card or redirection" msgstr "" #: share/virtualbricks.template.glade:2853 #: share/virtualbricks.template.glade:11302 #: share/virtualbricks.template.glade:2890 #: share/virtualbricks.template.glade:11339 msgid "Remove" msgstr "" #: share/virtualbricks.template.glade:2913 #: share/virtualbricks.template.glade:2950 msgid "SMB share" msgstr "" #: share/virtualbricks.template.glade:2938 #: share/virtualbricks.template.glade:2975 msgid "SMB Share" msgstr "" #: share/virtualbricks.template.glade:2994 #: share/virtualbricks.template.glade:3031 msgid "Network cards" msgstr "" #: share/virtualbricks.template.glade:3027 #: share/virtualbricks.template.glade:3064 msgid "Network" msgstr "" #: share/virtualbricks.template.glade:3055 #: share/virtualbricks.template.glade:3092 msgid "Use a custom kernel" msgstr "" #: share/virtualbricks.template.glade:3068 #: share/virtualbricks.template.glade:3105 msgid "Specify initial ramdisk" msgstr "" #: share/virtualbricks.template.glade:3099 #: share/virtualbricks.template.glade:3136 msgid "Parameters to append to command line:" msgstr "" #: share/virtualbricks.template.glade:3211 #: share/virtualbricks.template.glade:3248 msgid "Enable kernel debugging" msgstr "" #: share/virtualbricks.template.glade:3226 #: share/virtualbricks.template.glade:3263 msgid "GNU debugger TCP port:" msgstr "" #: share/virtualbricks.template.glade:3259 #: share/virtualbricks.template.glade:3296 msgid "Booting Linux" msgstr "" #: share/virtualbricks.template.glade:3286 #: share/virtualbricks.template.glade:3323 msgid "Customize Linux Boot" msgstr "" #: share/virtualbricks.template.glade:3379 #: share/virtualbricks.template.glade:3416 msgid "Virtual Machine Icon" msgstr "" #: share/virtualbricks.template.glade:3419 #: share/virtualbricks.template.glade:3456 msgid "Others" msgstr "" #: share/virtualbricks.template.glade:3473 #: share/virtualbricks.template.glade:10126 #: share/virtualbricks.template.glade:3510 #: share/virtualbricks.template.glade:10163 msgid "<=== connect ===>" msgstr "" #: share/virtualbricks.template.glade:3502 #: share/virtualbricks.template.glade:3539 msgid "Plugs" msgstr "" #: share/virtualbricks.template.glade:3532 #: share/virtualbricks.template.glade:4256 #: share/virtualbricks.template.glade:5024 #: share/virtualbricks.template.glade:5745 #: share/virtualbricks.template.glade:6488 #: share/virtualbricks.template.glade:7209 #: share/virtualbricks.template.glade:7950 #: share/virtualbricks.template.glade:8675 #: share/virtualbricks.template.glade:9407 #: share/virtualbricks.template.glade:3569 #: share/virtualbricks.template.glade:4293 #: share/virtualbricks.template.glade:5061 #: share/virtualbricks.template.glade:5782 #: share/virtualbricks.template.glade:6525 #: share/virtualbricks.template.glade:7246 #: share/virtualbricks.template.glade:7987 #: share/virtualbricks.template.glade:8712 #: share/virtualbricks.template.glade:9444 msgid "Symmetrical" msgstr "" #: share/virtualbricks.template.glade:3550 #: share/virtualbricks.template.glade:5042 #: share/virtualbricks.template.glade:5763 #: share/virtualbricks.template.glade:6506 #: share/virtualbricks.template.glade:7227 #: share/virtualbricks.template.glade:7968 #: share/virtualbricks.template.glade:8693 #: share/virtualbricks.template.glade:9425 #: share/virtualbricks.template.glade:3587 #: share/virtualbricks.template.glade:5079 #: share/virtualbricks.template.glade:5800 #: share/virtualbricks.template.glade:6543 #: share/virtualbricks.template.glade:7264 #: share/virtualbricks.template.glade:8005 #: share/virtualbricks.template.glade:8730 #: share/virtualbricks.template.glade:9462 msgid "Multiplier" msgstr "" #: share/virtualbricks.template.glade:3579 #: share/virtualbricks.template.glade:4303 #: share/virtualbricks.template.glade:5069 #: share/virtualbricks.template.glade:5792 #: share/virtualbricks.template.glade:6533 #: share/virtualbricks.template.glade:7254 #: share/virtualbricks.template.glade:7998 #: share/virtualbricks.template.glade:8720 #: share/virtualbricks.template.glade:9454 #: share/virtualbricks.template.glade:3616 #: share/virtualbricks.template.glade:4340 #: share/virtualbricks.template.glade:5106 #: share/virtualbricks.template.glade:5829 #: share/virtualbricks.template.glade:6570 #: share/virtualbricks.template.glade:7291 #: share/virtualbricks.template.glade:8035 #: share/virtualbricks.template.glade:8757 #: share/virtualbricks.template.glade:9491 msgid "UM" msgstr "" #: share/virtualbricks.template.glade:3605 #: share/virtualbricks.template.glade:4329 #: share/virtualbricks.template.glade:5094 #: share/virtualbricks.template.glade:5817 #: share/virtualbricks.template.glade:6558 #: share/virtualbricks.template.glade:7279 #: share/virtualbricks.template.glade:8024 #: share/virtualbricks.template.glade:8745 #: share/virtualbricks.template.glade:9480 #: share/virtualbricks.template.glade:3642 #: share/virtualbricks.template.glade:4366 #: share/virtualbricks.template.glade:5131 #: share/virtualbricks.template.glade:5854 #: share/virtualbricks.template.glade:6595 #: share/virtualbricks.template.glade:7316 #: share/virtualbricks.template.glade:8061 #: share/virtualbricks.template.glade:8782 #: share/virtualbricks.template.glade:9517 msgid "General parameters" msgstr "" #: share/virtualbricks.template.glade:3632 #: share/virtualbricks.template.glade:3819 #: share/virtualbricks.template.glade:4015 #: share/virtualbricks.template.glade:4356 #: share/virtualbricks.template.glade:4543 #: share/virtualbricks.template.glade:4739 #: share/virtualbricks.template.glade:5121 #: share/virtualbricks.template.glade:5308 #: share/virtualbricks.template.glade:5504 #: share/virtualbricks.template.glade:5844 #: share/virtualbricks.template.glade:6031 #: share/virtualbricks.template.glade:6227 #: share/virtualbricks.template.glade:6585 #: share/virtualbricks.template.glade:6772 #: share/virtualbricks.template.glade:6968 #: share/virtualbricks.template.glade:7306 #: share/virtualbricks.template.glade:7493 #: share/virtualbricks.template.glade:7689 #: share/virtualbricks.template.glade:8051 #: share/virtualbricks.template.glade:8238 #: share/virtualbricks.template.glade:8434 #: share/virtualbricks.template.glade:8772 #: share/virtualbricks.template.glade:8959 #: share/virtualbricks.template.glade:9155 #: share/virtualbricks.template.glade:9507 #: share/virtualbricks.template.glade:9577 #: share/virtualbricks.template.glade:9656 #: share/virtualbricks.template.glade:3669 #: share/virtualbricks.template.glade:3856 #: share/virtualbricks.template.glade:4052 #: share/virtualbricks.template.glade:4393 #: share/virtualbricks.template.glade:4580 #: share/virtualbricks.template.glade:4776 #: share/virtualbricks.template.glade:5158 #: share/virtualbricks.template.glade:5345 #: share/virtualbricks.template.glade:5541 #: share/virtualbricks.template.glade:5881 #: share/virtualbricks.template.glade:6068 #: share/virtualbricks.template.glade:6264 #: share/virtualbricks.template.glade:6622 #: share/virtualbricks.template.glade:6809 #: share/virtualbricks.template.glade:7005 #: share/virtualbricks.template.glade:7343 #: share/virtualbricks.template.glade:7530 #: share/virtualbricks.template.glade:7726 #: share/virtualbricks.template.glade:8088 #: share/virtualbricks.template.glade:8275 #: share/virtualbricks.template.glade:8471 #: share/virtualbricks.template.glade:8809 #: share/virtualbricks.template.glade:8996 #: share/virtualbricks.template.glade:9192 #: share/virtualbricks.template.glade:9544 #: share/virtualbricks.template.glade:9614 #: share/virtualbricks.template.glade:9693 msgid "Base" msgstr "" #: share/virtualbricks.template.glade:3671 #: share/virtualbricks.template.glade:3858 #: share/virtualbricks.template.glade:4054 #: share/virtualbricks.template.glade:4395 #: share/virtualbricks.template.glade:4582 #: share/virtualbricks.template.glade:4778 #: share/virtualbricks.template.glade:5160 #: share/virtualbricks.template.glade:5347 #: share/virtualbricks.template.glade:5543 #: share/virtualbricks.template.glade:5883 #: share/virtualbricks.template.glade:6070 #: share/virtualbricks.template.glade:6266 #: share/virtualbricks.template.glade:6624 #: share/virtualbricks.template.glade:6811 #: share/virtualbricks.template.glade:7007 #: share/virtualbricks.template.glade:7345 #: share/virtualbricks.template.glade:7532 #: share/virtualbricks.template.glade:7728 #: share/virtualbricks.template.glade:8090 #: share/virtualbricks.template.glade:8277 #: share/virtualbricks.template.glade:8473 #: share/virtualbricks.template.glade:8811 #: share/virtualbricks.template.glade:8998 #: share/virtualbricks.template.glade:9194 #: share/virtualbricks.template.glade:3708 #: share/virtualbricks.template.glade:3895 #: share/virtualbricks.template.glade:4091 #: share/virtualbricks.template.glade:4432 #: share/virtualbricks.template.glade:4619 #: share/virtualbricks.template.glade:4815 #: share/virtualbricks.template.glade:5197 #: share/virtualbricks.template.glade:5384 #: share/virtualbricks.template.glade:5580 #: share/virtualbricks.template.glade:5920 #: share/virtualbricks.template.glade:6107 #: share/virtualbricks.template.glade:6303 #: share/virtualbricks.template.glade:6661 #: share/virtualbricks.template.glade:6848 #: share/virtualbricks.template.glade:7044 #: share/virtualbricks.template.glade:7382 #: share/virtualbricks.template.glade:7569 #: share/virtualbricks.template.glade:7765 #: share/virtualbricks.template.glade:8127 #: share/virtualbricks.template.glade:8314 #: share/virtualbricks.template.glade:8510 #: share/virtualbricks.template.glade:8848 #: share/virtualbricks.template.glade:9035 #: share/virtualbricks.template.glade:9231 msgid "±" msgstr "" #: share/virtualbricks.template.glade:3692 #: share/virtualbricks.template.glade:3879 #: share/virtualbricks.template.glade:4075 #: share/virtualbricks.template.glade:4416 #: share/virtualbricks.template.glade:4603 #: share/virtualbricks.template.glade:4799 #: share/virtualbricks.template.glade:5181 #: share/virtualbricks.template.glade:5368 #: share/virtualbricks.template.glade:5564 #: share/virtualbricks.template.glade:5904 #: share/virtualbricks.template.glade:6091 #: share/virtualbricks.template.glade:6287 #: share/virtualbricks.template.glade:6645 #: share/virtualbricks.template.glade:6832 #: share/virtualbricks.template.glade:7028 #: share/virtualbricks.template.glade:7366 #: share/virtualbricks.template.glade:7553 #: share/virtualbricks.template.glade:7749 #: share/virtualbricks.template.glade:8111 #: share/virtualbricks.template.glade:8298 #: share/virtualbricks.template.glade:8494 #: share/virtualbricks.template.glade:8832 #: share/virtualbricks.template.glade:9019 #: share/virtualbricks.template.glade:9215 #: share/virtualbricks.template.glade:3729 #: share/virtualbricks.template.glade:3916 #: share/virtualbricks.template.glade:4112 #: share/virtualbricks.template.glade:4453 #: share/virtualbricks.template.glade:4640 #: share/virtualbricks.template.glade:4836 #: share/virtualbricks.template.glade:5218 #: share/virtualbricks.template.glade:5405 #: share/virtualbricks.template.glade:5601 #: share/virtualbricks.template.glade:5941 #: share/virtualbricks.template.glade:6128 #: share/virtualbricks.template.glade:6324 #: share/virtualbricks.template.glade:6682 #: share/virtualbricks.template.glade:6869 #: share/virtualbricks.template.glade:7065 #: share/virtualbricks.template.glade:7403 #: share/virtualbricks.template.glade:7590 #: share/virtualbricks.template.glade:7786 #: share/virtualbricks.template.glade:8148 #: share/virtualbricks.template.glade:8335 #: share/virtualbricks.template.glade:8531 #: share/virtualbricks.template.glade:8869 #: share/virtualbricks.template.glade:9056 #: share/virtualbricks.template.glade:9252 msgid "Jitter" msgstr "" #: share/virtualbricks.template.glade:3731 #: share/virtualbricks.template.glade:3918 #: share/virtualbricks.template.glade:4114 #: share/virtualbricks.template.glade:4455 #: share/virtualbricks.template.glade:4642 #: share/virtualbricks.template.glade:4838 #: share/virtualbricks.template.glade:5220 #: share/virtualbricks.template.glade:5407 #: share/virtualbricks.template.glade:5603 #: share/virtualbricks.template.glade:5943 #: share/virtualbricks.template.glade:6130 #: share/virtualbricks.template.glade:6326 #: share/virtualbricks.template.glade:6684 #: share/virtualbricks.template.glade:6871 #: share/virtualbricks.template.glade:7067 #: share/virtualbricks.template.glade:7405 #: share/virtualbricks.template.glade:7592 #: share/virtualbricks.template.glade:7788 #: share/virtualbricks.template.glade:8150 #: share/virtualbricks.template.glade:8337 #: share/virtualbricks.template.glade:8533 #: share/virtualbricks.template.glade:8871 #: share/virtualbricks.template.glade:9058 #: share/virtualbricks.template.glade:9254 #: share/virtualbricks.template.glade:3768 #: share/virtualbricks.template.glade:3955 #: share/virtualbricks.template.glade:4151 #: share/virtualbricks.template.glade:4492 #: share/virtualbricks.template.glade:4679 #: share/virtualbricks.template.glade:4875 #: share/virtualbricks.template.glade:5257 #: share/virtualbricks.template.glade:5444 #: share/virtualbricks.template.glade:5640 #: share/virtualbricks.template.glade:5980 #: share/virtualbricks.template.glade:6167 #: share/virtualbricks.template.glade:6363 #: share/virtualbricks.template.glade:6721 #: share/virtualbricks.template.glade:6908 #: share/virtualbricks.template.glade:7104 #: share/virtualbricks.template.glade:7442 #: share/virtualbricks.template.glade:7629 #: share/virtualbricks.template.glade:7825 #: share/virtualbricks.template.glade:8187 #: share/virtualbricks.template.glade:8374 #: share/virtualbricks.template.glade:8570 #: share/virtualbricks.template.glade:8908 #: share/virtualbricks.template.glade:9095 #: share/virtualbricks.template.glade:9291 msgid "%" msgstr "" #: share/virtualbricks.template.glade:3751 #: share/virtualbricks.template.glade:3938 #: share/virtualbricks.template.glade:4134 #: share/virtualbricks.template.glade:4858 #: share/virtualbricks.template.glade:5240 #: share/virtualbricks.template.glade:5427 #: share/virtualbricks.template.glade:5623 #: share/virtualbricks.template.glade:5963 #: share/virtualbricks.template.glade:6150 #: share/virtualbricks.template.glade:6346 #: share/virtualbricks.template.glade:6704 #: share/virtualbricks.template.glade:6891 #: share/virtualbricks.template.glade:7087 #: share/virtualbricks.template.glade:7425 #: share/virtualbricks.template.glade:7612 #: share/virtualbricks.template.glade:7808 #: share/virtualbricks.template.glade:8170 #: share/virtualbricks.template.glade:8357 #: share/virtualbricks.template.glade:8553 #: share/virtualbricks.template.glade:8891 #: share/virtualbricks.template.glade:9078 #: share/virtualbricks.template.glade:9274 #: share/virtualbricks.template.glade:3788 #: share/virtualbricks.template.glade:3975 #: share/virtualbricks.template.glade:4171 #: share/virtualbricks.template.glade:4895 #: share/virtualbricks.template.glade:5277 #: share/virtualbricks.template.glade:5464 #: share/virtualbricks.template.glade:5660 #: share/virtualbricks.template.glade:6000 #: share/virtualbricks.template.glade:6187 #: share/virtualbricks.template.glade:6383 #: share/virtualbricks.template.glade:6741 #: share/virtualbricks.template.glade:6928 #: share/virtualbricks.template.glade:7124 #: share/virtualbricks.template.glade:7462 #: share/virtualbricks.template.glade:7649 #: share/virtualbricks.template.glade:7845 #: share/virtualbricks.template.glade:8207 #: share/virtualbricks.template.glade:8394 #: share/virtualbricks.template.glade:8590 #: share/virtualbricks.template.glade:8928 #: share/virtualbricks.template.glade:9115 #: share/virtualbricks.template.glade:9311 msgid "Distrib." msgstr "" #: share/virtualbricks.template.glade:3780 #: share/virtualbricks.template.glade:4504 #: share/virtualbricks.template.glade:5269 #: share/virtualbricks.template.glade:5992 #: share/virtualbricks.template.glade:6733 #: share/virtualbricks.template.glade:7454 #: share/virtualbricks.template.glade:8199 #: share/virtualbricks.template.glade:8920 #: share/virtualbricks.template.glade:9538 #: share/virtualbricks.template.glade:3817 #: share/virtualbricks.template.glade:4541 #: share/virtualbricks.template.glade:5306 #: share/virtualbricks.template.glade:6029 #: share/virtualbricks.template.glade:6770 #: share/virtualbricks.template.glade:7491 #: share/virtualbricks.template.glade:8236 #: share/virtualbricks.template.glade:8957 #: share/virtualbricks.template.glade:9575 msgid "Left to Right" msgstr "" #: share/virtualbricks.template.glade:3975 #: share/virtualbricks.template.glade:4699 #: share/virtualbricks.template.glade:5464 #: share/virtualbricks.template.glade:6187 #: share/virtualbricks.template.glade:6928 #: share/virtualbricks.template.glade:7649 #: share/virtualbricks.template.glade:8394 #: share/virtualbricks.template.glade:9115 #: share/virtualbricks.template.glade:9616 #: share/virtualbricks.template.glade:4012 #: share/virtualbricks.template.glade:4736 #: share/virtualbricks.template.glade:5501 #: share/virtualbricks.template.glade:6224 #: share/virtualbricks.template.glade:6965 #: share/virtualbricks.template.glade:7686 #: share/virtualbricks.template.glade:8431 #: share/virtualbricks.template.glade:9152 #: share/virtualbricks.template.glade:9653 msgid "Both Directions" msgstr "" #: share/virtualbricks.template.glade:4172 #: share/virtualbricks.template.glade:4896 #: share/virtualbricks.template.glade:5661 #: share/virtualbricks.template.glade:6384 #: share/virtualbricks.template.glade:7125 #: share/virtualbricks.template.glade:7846 #: share/virtualbricks.template.glade:8591 #: share/virtualbricks.template.glade:9312 #: share/virtualbricks.template.glade:9696 #: share/virtualbricks.template.glade:4209 #: share/virtualbricks.template.glade:4933 #: share/virtualbricks.template.glade:5698 #: share/virtualbricks.template.glade:6421 #: share/virtualbricks.template.glade:7162 #: share/virtualbricks.template.glade:7883 #: share/virtualbricks.template.glade:8628 #: share/virtualbricks.template.glade:9349 #: share/virtualbricks.template.glade:9733 msgid "Right to Left" msgstr "" #: share/virtualbricks.template.glade:4198 #: share/virtualbricks.template.glade:4235 msgid "Bandwidth Restriction" msgstr "" #: share/virtualbricks.template.glade:4484 #: share/virtualbricks.template.glade:4671 #: share/virtualbricks.template.glade:4521 msgid "" "Uniform\n" "Gaussian" msgstr "" #: share/virtualbricks.template.glade:4922 #: share/virtualbricks.template.glade:4959 msgid "Interface Speed" msgstr "" #: share/virtualbricks.template.glade:4941 #: share/virtualbricks.template.glade:4978 msgid "Enable(advanced)" msgstr "" #: share/virtualbricks.template.glade:4993 #: share/virtualbricks.template.glade:5030 msgid "Bandwidth" msgstr "" #: share/virtualbricks.template.glade:5687 #: share/virtualbricks.template.glade:5724 msgid "Packet Delay" msgstr "" #: share/virtualbricks.template.glade:6410 #: share/virtualbricks.template.glade:6447 msgid "Channel Buffer Size" msgstr "" #: share/virtualbricks.template.glade:6458 virtualbricks/brickfactory.py:822 #: share/virtualbricks.template.glade:6495 virtualbricks/brickfactory.py:885 msgid "Delay" msgstr "" #: share/virtualbricks.template.glade:7151 #: share/virtualbricks.template.glade:7188 msgid "Packet Loss" msgstr "" #: share/virtualbricks.template.glade:7872 #: share/virtualbricks.template.glade:7909 msgid "Packet Duplication" msgstr "" #: share/virtualbricks.template.glade:7920 #: share/virtualbricks.template.glade:7957 msgid "Disruptions 1/3" msgstr "" #: share/virtualbricks.template.glade:8617 #: share/virtualbricks.template.glade:8654 msgid "Noise" msgstr "" #: share/virtualbricks.template.glade:9338 #: share/virtualbricks.template.glade:9375 msgid "Lost Burst" msgstr "" #: share/virtualbricks.template.glade:9376 #: share/virtualbricks.template.glade:9413 msgid "Disruptions 2/3" msgstr "" #: share/virtualbricks.template.glade:9463 msgid "" "bits\n" "bytes" msgstr "" #: share/virtualbricks.template.glade:9722 #: share/virtualbricks.template.glade:9759 msgid "Maximum Transmission Unit (MTU)" msgstr "" #: share/virtualbricks.template.glade:9764 #: share/virtualbricks.template.glade:9801 msgid "Disruptions 3/3" msgstr "" #: share/virtualbricks.template.glade:9800 #: share/virtualbricks.template.glade:9837 msgid "Number of ports: " msgstr "" #: share/virtualbricks.template.glade:9826 #: share/virtualbricks.template.glade:9863 msgid "Use FSTP" msgstr "" #: share/virtualbricks.template.glade:9838 #: share/virtualbricks.template.glade:9875 msgid "Hub mode" msgstr "" #: share/virtualbricks.template.glade:9860 #: share/virtualbricks.template.glade:9897 msgid "Switch Configuration" msgstr "" #: share/virtualbricks.template.glade:9910 #: share/virtualbricks.template.glade:9947 msgid "" " \n" "\n" msgstr "" #: share/virtualbricks.template.glade:9941 #: share/virtualbricks.template.glade:9978 msgid "Don't touch interface settings" msgstr "" #: share/virtualbricks.template.glade:9951 #: share/virtualbricks.template.glade:9988 msgid "Use DHCP" msgstr "" #: share/virtualbricks.template.glade:9966 #: share/virtualbricks.template.glade:10003 msgid "Manual settings" msgstr "" #: share/virtualbricks.template.glade:9996 #: share/virtualbricks.template.glade:10033 msgid "IP Address: " msgstr "" #: share/virtualbricks.template.glade:10003 #: share/virtualbricks.template.glade:10040 msgid "Netmask: " msgstr "" #: share/virtualbricks.template.glade:10014 #: share/virtualbricks.template.glade:10051 msgid "Gateway: " msgstr "" #: share/virtualbricks.template.glade:10028 #: share/virtualbricks.template.glade:10065 msgid "10.0.0.1" msgstr "" #: share/virtualbricks.template.glade:10043 #: share/virtualbricks.template.glade:10080 msgid "255.0.0.0" msgstr "" #: share/virtualbricks.template.glade:10084 #: share/virtualbricks.template.glade:10121 msgid "Tap Configuration" msgstr "" #: share/virtualbricks.template.glade:10177 #: share/virtualbricks.template.glade:14202 #: share/virtualbricks.template.glade:10214 #: share/virtualbricks.template.glade:14239 msgid "Delay:" msgstr "" #: share/virtualbricks.template.glade:10209 virtualbricks/brickfactory.py:825 #: share/virtualbricks.template.glade:10246 virtualbricks/brickfactory.py:888 msgid "Actions" msgstr "" #: share/virtualbricks.template.glade:10248 #: share/virtualbricks.template.glade:10285 msgid "Event Configuration" msgstr "" #: share/virtualbricks.template.glade:10283 #: share/virtualbricks.template.glade:10398 #: share/virtualbricks.template.glade:10320 #: share/virtualbricks.template.glade:10435 msgid "Connect to" msgstr "" #: share/virtualbricks.template.glade:10315 #: share/virtualbricks.template.glade:10352 msgid "Listen to port:" msgstr "" #: share/virtualbricks.template.glade:10325 #: share/virtualbricks.template.glade:10362 msgid "Expect password:" msgstr "" #: share/virtualbricks.template.glade:10364 #: share/virtualbricks.template.glade:10401 msgid "Tunnel server Configuration" msgstr "" #: share/virtualbricks.template.glade:10418 #: share/virtualbricks.template.glade:12758 #: share/virtualbricks.template.glade:10455 #: share/virtualbricks.template.glade:12795 msgid "port:" msgstr "" #: share/virtualbricks.template.glade:10448 #: share/virtualbricks.template.glade:13780 #: share/virtualbricks.template.glade:10485 #: share/virtualbricks.template.glade:13817 msgid "Tunnel Server" msgstr "" #: share/virtualbricks.template.glade:10473 #: share/virtualbricks.template.glade:10510 msgid "Password:" msgstr "" #: share/virtualbricks.template.glade:10484 #: share/virtualbricks.template.glade:10521 msgid "Local port:" msgstr "" #: share/virtualbricks.template.glade:10527 #: share/virtualbricks.template.glade:10564 msgid "Tunnel client Configuration" msgstr "" #: share/virtualbricks.template.glade:10566 #: share/virtualbricks.template.glade:10603 msgid "WAIT..." msgstr "" #: share/virtualbricks.template.glade:10671 #: share/virtualbricks.template.glade:10708 msgid "Virtualbricks Settings" msgstr "" #: share/virtualbricks.template.glade:10684 #: share/virtualbricks.template.glade:10721 msgid "System Settings" msgstr "" #: share/virtualbricks.template.glade:10719 #: share/virtualbricks.template.glade:10756 msgid "Bricks directory" msgstr "" #: share/virtualbricks.template.glade:10727 #: share/virtualbricks.template.glade:10863 #: share/virtualbricks.template.glade:11012 #: share/virtualbricks.template.glade:11096 #: share/virtualbricks.template.glade:10764 #: share/virtualbricks.template.glade:10900 #: share/virtualbricks.template.glade:11049 #: share/virtualbricks.template.glade:11133 msgid "Select A Folder" msgstr "" #: share/virtualbricks.template.glade:10738 #: share/virtualbricks.template.glade:10775 msgid "X-window terminal command" msgstr "" #: share/virtualbricks.template.glade:10749 #: share/virtualbricks.template.glade:10786 msgid "X-window sudo command" msgstr "" #: share/virtualbricks.template.glade:10760 #: share/virtualbricks.template.glade:10797 msgid "your favorite x-terminal-emulator" msgstr "" #: share/virtualbricks.template.glade:10774 #: share/virtualbricks.template.glade:10811 msgid "command to perform administrative actions on your system" msgstr "" #: share/virtualbricks.template.glade:10798 #: share/virtualbricks.template.glade:10835 msgid "Enable SysTray" msgstr "" #: share/virtualbricks.template.glade:10819 #: share/virtualbricks.template.glade:10856 msgid "General" msgstr "" #: share/virtualbricks.template.glade:10855 #: share/virtualbricks.template.glade:10892 msgid "VDE binaries path" msgstr "" #: share/virtualbricks.template.glade:10861 #: share/virtualbricks.template.glade:10898 msgid "Path for vde components installed on the system" msgstr "" #: share/virtualbricks.template.glade:10876 #: share/virtualbricks.template.glade:11025 #: share/virtualbricks.template.glade:10913 #: share/virtualbricks.template.glade:11062 msgid "Status:" msgstr "" #: share/virtualbricks.template.glade:10892 #: share/virtualbricks.template.glade:10929 msgid "" "Error:\n" "invalid path for vde binaries" msgstr "" #: share/virtualbricks.template.glade:10919 #: share/virtualbricks.template.glade:10956 msgid "Use python support" msgstr "" #: share/virtualbricks.template.glade:10923 #: share/virtualbricks.template.glade:10960 msgid "Use native python support from libvdeplug" msgstr "" #: share/virtualbricks.template.glade:10932 #: share/virtualbricks.template.glade:10969 msgid "Allow female plugs on devices" msgstr "" #: share/virtualbricks.template.glade:10936 #: share/virtualbricks.template.glade:10973 msgid "Allow use of female plugs with all brick types" msgstr "" #: share/virtualbricks.template.glade:10945 #: share/virtualbricks.template.glade:10982 msgid "Network topology loop detection" msgstr "" #: share/virtualbricks.template.glade:10949 #: share/virtualbricks.template.glade:10986 msgid "" "If enabled, detect network loops when starting the bricks, and generate an " "error." msgstr "" #: share/virtualbricks.template.glade:10963 #: share/virtualbricks.template.glade:11000 msgid "Vde" msgstr "" #: share/virtualbricks.template.glade:11004 #: share/virtualbricks.template.glade:11041 msgid "Qemu/KVM binaries path" msgstr "" #: share/virtualbricks.template.glade:11010 #: share/virtualbricks.template.glade:11047 msgid "Path for qemu and kvm binaries" msgstr "" #: share/virtualbricks.template.glade:11041 #: share/virtualbricks.template.glade:11078 msgid "" "Error:\n" "invalid path for qemu/kvm binaries" msgstr "" #: share/virtualbricks.template.glade:11088 #: share/virtualbricks.template.glade:11125 msgid "Disk images repository" msgstr "" #: share/virtualbricks.template.glade:11094 #: share/virtualbricks.template.glade:11131 msgid "Directory that contains hard disk images" msgstr "" #: share/virtualbricks.template.glade:11112 #: share/virtualbricks.template.glade:11149 msgid "Disk Images" msgstr "" #: share/virtualbricks.template.glade:11140 #: share/virtualbricks.template.glade:11177 msgid "Use KVM" msgstr "" #: share/virtualbricks.template.glade:11144 #: share/virtualbricks.template.glade:11181 msgid "Allow the use of kernel-based virtual machine (recommended)" msgstr "" #: share/virtualbricks.template.glade:11154 #: share/virtualbricks.template.glade:11191 msgid "Enable KSM" msgstr "" #: share/virtualbricks.template.glade:11158 #: share/virtualbricks.template.glade:11195 msgid "Allow using the Kernel SamePage Merging support to enhance scalability" msgstr "" #: share/virtualbricks.template.glade:11173 #: share/virtualbricks.template.glade:11210 msgid "Use kqemu" msgstr "" #: share/virtualbricks.template.glade:11177 #: share/virtualbricks.template.glade:11214 msgid "Use old kqemu support" msgstr "" #: share/virtualbricks.template.glade:11191 #: share/virtualbricks.template.glade:11228 msgid "X86 optimizations" msgstr "" #: share/virtualbricks.template.glade:11208 #: share/virtualbricks.template.glade:11245 msgid "CD-Rom/DVD/Floppy Devices" msgstr "" #: share/virtualbricks.template.glade:11228 #: share/virtualbricks.template.glade:11265 msgid "" "Add your \"real\" physical drive volumes like CDR, DVD or Floppy devices " "here." msgstr "" #: share/virtualbricks.template.glade:11245 #: share/virtualbricks.template.glade:11282 msgid "Name: " msgstr "" #: share/virtualbricks.template.glade:11266 #: share/virtualbricks.template.glade:11303 msgid "Device Path: " msgstr "" #: share/virtualbricks.template.glade:11286 #: share/virtualbricks.template.glade:11323 msgid "Add" msgstr "" #: share/virtualbricks.template.glade:11330 #: share/virtualbricks.template.glade:11367 msgid "Qemu/KVM " msgstr "" #: share/virtualbricks.template.glade:11417 #: share/virtualbricks.template.glade:11454 msgid "Add Bookmark" msgstr "" #: share/virtualbricks.template.glade:11431 #: share/virtualbricks.template.glade:11468 msgid "Name:" msgstr "" #: share/virtualbricks.template.glade:11456 #: share/virtualbricks.template.glade:11493 msgid "Path:" msgstr "" #: share/virtualbricks.template.glade:11485 #: share/virtualbricks.template.glade:11522 msgid "Select A Icon" msgstr "" #: share/virtualbricks.template.glade:11495 #: share/virtualbricks.template.glade:11532 msgid "Icon for this Machine" msgstr "" #: share/virtualbricks.template.glade:11575 #: share/virtualbricks.template.glade:12064 #: share/virtualbricks.template.glade:11612 #: share/virtualbricks.template.glade:12101 msgid "show qemu volume info for selected image" msgstr "" #: share/virtualbricks.template.glade:11590 #: share/virtualbricks.template.glade:11627 msgid "remove this entry from My Machines" msgstr "" #: share/virtualbricks.template.glade:11600 #: share/virtualbricks.template.glade:11637 msgid "About: Virtualbricks" msgstr "" #: share/virtualbricks.template.glade:11656 #: share/virtualbricks.template.glade:11693 msgid "" "Virtualbricks is a GNU/Linux desktop gui for Qemu/KVM and Virtual " "Distributed Ethernet.\n" "\n" "Virtualbricks is licensed under the terms of the GPL (General Public " "Licence) Version 2.\n" "© 2011 Daniele Lacamera, Rainer Haage and the virtualbricks team on " "Launchpad. \n" "\n" "VDE - Virtual Distributed Ethernet - © 2003-2011 Renzo Davoli.\n" "QEMU - Copyright © 2005-2011 Fabrice Bellard.\n" "QEMU is a trademark of Fabrice Bellard.\n" "\n" "Icons for remote hosts are Copyleft David Vignoni - http://www.icon-king." "com/ License: LGPL\n" "\n" "If you find virtualbricks useful for your business, please consider making a " "donation." msgstr "" #: share/virtualbricks.template.glade:11713 #: share/virtualbricks.template.glade:11750 msgid "create new empty image" msgstr "" #: share/virtualbricks.template.glade:11730 #: share/virtualbricks.template.glade:11767 msgid "create new empty Disk image\n" msgstr "" #: share/virtualbricks.template.glade:11743 #: share/virtualbricks.template.glade:11780 msgid "Target Folder for the new image" msgstr "" #: share/virtualbricks.template.glade:11753 #: share/virtualbricks.template.glade:11790 msgid "Select A Directory" msgstr "" #: share/virtualbricks.template.glade:11776 #: share/virtualbricks.template.glade:11813 msgid "Name of the new image (or base image)" msgstr "" #: share/virtualbricks.template.glade:11791 #: share/virtualbricks.template.glade:11828 msgid "Enter a filename for the new image" msgstr "" #: share/virtualbricks.template.glade:11822 #: share/virtualbricks.template.glade:11859 msgid "Image format" msgstr "" #: share/virtualbricks.template.glade:11833 #: share/virtualbricks.template.glade:11870 msgid "" "Auto\n" "raw\n" "qcow\n" "qcow2\n" "cow\n" "vmdk\n" "cloop" msgstr "" #: share/virtualbricks.template.glade:11860 #: share/virtualbricks.template.glade:11897 msgid "Size" msgstr "" #: share/virtualbricks.template.glade:11875 #: share/virtualbricks.template.glade:11912 msgid "Size of the new image" msgstr "" #: share/virtualbricks.template.glade:11889 #: share/virtualbricks.template.glade:11926 msgid "" "KB\n" "MB\n" "GB" msgstr "" #: share/virtualbricks.template.glade:11949 #: share/virtualbricks.template.glade:11986 msgid "Create" msgstr "" #: share/virtualbricks.template.glade:11999 #: share/virtualbricks.template.glade:12036 msgid "message" msgstr "" #: share/virtualbricks.template.glade:12074 #: share/virtualbricks.template.glade:12111 msgid "add this image to bookmarks" msgstr "" #: share/virtualbricks.template.glade:12084 #: share/virtualbricks.template.glade:12121 msgid "Control monitor" msgstr "" #: share/virtualbricks.template.glade:12099 #: share/virtualbricks.template.glade:12136 msgid "control monitor for selected qemu job" msgstr "" #: share/virtualbricks.template.glade:12115 #: share/virtualbricks.template.glade:12152 msgid "kill emulation immediately" msgstr "" #: share/virtualbricks.template.glade:12128 #: share/virtualbricks.template.glade:12165 msgid "reset emulation" msgstr "" #: share/virtualbricks.template.glade:12149 #: share/virtualbricks.template.glade:12186 msgid "pause emulation" msgstr "" #: share/virtualbricks.template.glade:12162 #: share/virtualbricks.template.glade:12199 msgid "resume emulation" msgstr "" #: share/virtualbricks.template.glade:12190 #: share/virtualbricks.template.glade:12227 msgid "Available block devices" msgstr "" #: share/virtualbricks.template.glade:12208 #: share/virtualbricks.template.glade:12245 msgid "" "This is a list of all blockdevices used by the emulation. Rightclick an " "entry to eject. (hd volumes normally can not be ejected)" msgstr "" #: share/virtualbricks.template.glade:12222 #: share/virtualbricks.template.glade:12259 msgid "change soure of block devices" msgstr "" #: share/virtualbricks.template.glade:12238 #: share/virtualbricks.template.glade:12253 #: share/virtualbricks.template.glade:12270 #: share/virtualbricks.template.glade:12275 #: share/virtualbricks.template.glade:12290 #: share/virtualbricks.template.glade:12307 msgid "Change" msgstr "" #: share/virtualbricks.template.glade:12242 #: share/virtualbricks.template.glade:12279 msgid "change the source for qemu cdrom device to the selected image or drive" msgstr "" #: share/virtualbricks.template.glade:12257 #: share/virtualbricks.template.glade:12294 msgid "" "change the source for qemu floppy A device to the selected image or drive" msgstr "" #: share/virtualbricks.template.glade:12274 #: share/virtualbricks.template.glade:12311 msgid "" "change the source for qemu floppy B device to the selected image or drive" msgstr "" #: share/virtualbricks.template.glade:12289 #: share/virtualbricks.template.glade:12326 msgid "cdrom" msgstr "" #: share/virtualbricks.template.glade:12332 #: share/virtualbricks.template.glade:12345 #: share/virtualbricks.template.glade:12361 #: share/virtualbricks.template.glade:12369 #: share/virtualbricks.template.glade:12382 #: share/virtualbricks.template.glade:12398 msgid "None" msgstr "" #: share/virtualbricks.template.glade:12397 #: share/virtualbricks.template.glade:12434 msgid "Available host usb devices" msgstr "" #: share/virtualbricks.template.glade:12415 #: share/virtualbricks.template.glade:12452 msgid "" "All available host usb-devices. rightclick to attach a device to the virtual " "engine (you must have write access to /proc/bus/usb to attach devices)" msgstr "" #: share/virtualbricks.template.glade:12429 #: share/virtualbricks.template.glade:12466 msgid "Attached guest usb devices" msgstr "" #: share/virtualbricks.template.glade:12447 #: share/virtualbricks.template.glade:12484 msgid "" "All attached usb devices for this emulation. Rightclick to detach a device" msgstr "" #: share/virtualbricks.template.glade:12466 #: share/virtualbricks.template.glade:12503 msgid "USB" msgstr "" #: share/virtualbricks.template.glade:12478 #: share/virtualbricks.template.glade:12515 msgid "coming soon..." msgstr "" #: share/virtualbricks.template.glade:12488 #: share/virtualbricks.template.glade:12525 msgid "Emulation" msgstr "" #: share/virtualbricks.template.glade:12540 #: share/virtualbricks.template.glade:12577 msgid "open control monitor" msgstr "" #: share/virtualbricks.template.glade:12577 #: share/virtualbricks.template.glade:12614 msgid "Suspend Qemu" msgstr "" #: share/virtualbricks.template.glade:12586 #: share/virtualbricks.template.glade:12623 msgid "Send ACPI poweroff" msgstr "" #: share/virtualbricks.template.glade:12595 #: share/virtualbricks.template.glade:12632 msgid "Send ACPI hard reset" msgstr "" #: share/virtualbricks.template.glade:12651 #: share/virtualbricks.template.glade:12688 msgid "eject / unmount selected device" msgstr "" #: share/virtualbricks.template.glade:12659 #: share/virtualbricks.template.glade:12696 msgid "Setup new network card" msgstr "" #: share/virtualbricks.template.glade:12672 #: share/virtualbricks.template.glade:12709 msgid "Network Type" msgstr "" #: share/virtualbricks.template.glade:12684 #: share/virtualbricks.template.glade:12721 msgid "" "Open a TUN/TAP interface\n" "Use an already open TUN/TAP interface\n" "Open a listening TCP socket\n" "Use an already open TCP socket\n" "Connect to listening TCP socket\n" "Create shared VLAN via UDP multicast socket\n" "Use an already open UDP multicast socket" msgstr "" #: share/virtualbricks.template.glade:12719 #: share/virtualbricks.template.glade:12756 msgid "IP address: " msgstr "" #: share/virtualbricks.template.glade:12730 #: share/virtualbricks.template.glade:12767 msgid "MAC address: " msgstr "" #: share/virtualbricks.template.glade:12771 #: share/virtualbricks.template.glade:12808 msgid "VLAN:" msgstr "" #: share/virtualbricks.template.glade:12852 #: share/virtualbricks.template.glade:12889 msgid "TUN/TAP configuration script:" msgstr "" #: share/virtualbricks.template.glade:12863 #: share/virtualbricks.template.glade:12900 msgid "Name of network interface:" msgstr "" #: share/virtualbricks.template.glade:12947 #: share/virtualbricks.template.glade:12984 msgid "File descriptor: " msgstr "" #: share/virtualbricks.template.glade:13026 #: share/virtualbricks.template.glade:13063 msgid "Request" msgstr "" #: share/virtualbricks.template.glade:13054 #: share/virtualbricks.template.glade:14382 #: share/virtualbricks.template.glade:13091 #: share/virtualbricks.template.glade:14419 msgid "Are you sure?" msgstr "" #: share/virtualbricks.template.glade:13113 #: share/virtualbricks.template.glade:13150 msgid "Add redirect" msgstr "" #: share/virtualbricks.template.glade:13138 #: share/virtualbricks.template.glade:13175 msgid "TCP" msgstr "" #: share/virtualbricks.template.glade:13154 #: share/virtualbricks.template.glade:13191 msgid "UDP" msgstr "" #: share/virtualbricks.template.glade:13177 #: share/virtualbricks.template.glade:13225 #: share/virtualbricks.template.glade:13214 #: share/virtualbricks.template.glade:13262 msgid "port " msgstr "" #: share/virtualbricks.template.glade:13202 #: share/virtualbricks.template.glade:13239 msgid "to guest IP " msgstr "" #: share/virtualbricks.template.glade:13254 #: share/virtualbricks.template.glade:13291 msgid "Add redirect(s)" msgstr "" #: share/virtualbricks.template.glade:13324 #: share/virtualbricks.template.glade:13361 msgid "Mode:" msgstr "" #: share/virtualbricks.template.glade:13336 #: share/virtualbricks.template.glade:13373 msgid "DHCP" msgstr "" #: share/virtualbricks.template.glade:13349 #: share/virtualbricks.template.glade:13386 msgid "Manual" msgstr "" #: share/virtualbricks.template.glade:13387 #: share/virtualbricks.template.glade:13424 msgid "Address:" msgstr "" #: share/virtualbricks.template.glade:13393 #: share/virtualbricks.template.glade:13430 msgid "Netmask:" msgstr "" #: share/virtualbricks.template.glade:13437 #: share/virtualbricks.template.glade:13474 msgid "Advanced" msgstr "" #: share/virtualbricks.template.glade:13458 #: share/virtualbricks.template.glade:13887 #: share/virtualbricks.template.glade:14242 #: share/virtualbricks.template.glade:13495 #: share/virtualbricks.template.glade:13924 #: share/virtualbricks.template.glade:14279 msgid "Cancel" msgstr "" #: share/virtualbricks.template.glade:13471 #: share/virtualbricks.template.glade:13902 #: share/virtualbricks.template.glade:14257 #: share/virtualbricks.template.glade:13508 #: share/virtualbricks.template.glade:13939 #: share/virtualbricks.template.glade:14294 msgid "Ok" msgstr "" #: share/virtualbricks.template.glade:13537 #: share/virtualbricks.template.glade:13574 msgid "Switch" msgstr "" #: share/virtualbricks.template.glade:13576 #: share/virtualbricks.template.glade:13613 msgid "Wire" msgstr "" #: share/virtualbricks.template.glade:13615 #: share/virtualbricks.template.glade:13652 msgid "Wirefilter" msgstr "" #: share/virtualbricks.template.glade:13654 #: share/virtualbricks.template.glade:13691 msgid "Tap" msgstr "" #: share/virtualbricks.template.glade:13702 #: share/virtualbricks.template.glade:13739 msgid "Tunnel Client" msgstr "" #: share/virtualbricks.template.glade:13741 #: share/virtualbricks.template.glade:13778 msgid "Virtual Machine" msgstr "" #: share/virtualbricks.template.glade:13805 #: share/virtualbricks.template.glade:13842 msgid "Run on remote host:" msgstr "" #: share/virtualbricks.template.glade:13853 #: share/virtualbricks.template.glade:13890 msgid "Brick name:" msgstr "" #: share/virtualbricks.template.glade:13931 #: share/virtualbricks.template.glade:13968 msgid "Event type selection" msgstr "" #: share/virtualbricks.template.glade:13978 #: share/virtualbricks.template.glade:14015 msgid "Brick Start" msgstr "" #: share/virtualbricks.template.glade:14016 #: share/virtualbricks.template.glade:14053 msgid "Brick Stop" msgstr "" #: share/virtualbricks.template.glade:14055 #: share/virtualbricks.template.glade:14092 msgid "Brick Config" msgstr "" #: share/virtualbricks.template.glade:14093 #: share/virtualbricks.template.glade:14130 msgid "" "Free\n" "Shell Command" msgstr "" #: share/virtualbricks.template.glade:14141 #: share/virtualbricks.template.glade:14178 msgid "Events Collation" msgstr "" #: share/virtualbricks.template.glade:14184 #: share/virtualbricks.template.glade:14221 msgid "Event name:" msgstr "" #: share/virtualbricks.template.glade:14214 #: share/virtualbricks.template.glade:14251 msgid "10" msgstr "" #: share/virtualbricks.template.glade:14290 #: share/virtualbricks.template.glade:14745 #: share/virtualbricks.template.glade:14327 #: share/virtualbricks.template.glade:14782 msgid " " msgstr "" #: share/virtualbricks.template.glade:14301 #: share/virtualbricks.template.glade:14756 #: share/virtualbricks.template.glade:14338 #: share/virtualbricks.template.glade:14793 msgid "_Start/Stop" msgstr "" #: share/virtualbricks.template.glade:14309 #: share/virtualbricks.template.glade:14764 #: share/virtualbricks.template.glade:14346 #: share/virtualbricks.template.glade:14801 msgid "_Delete" msgstr "" #: share/virtualbricks.template.glade:14317 #: share/virtualbricks.template.glade:14772 #: share/virtualbricks.template.glade:14354 #: share/virtualbricks.template.glade:14809 msgid "Make a C_opy" msgstr "" #: share/virtualbricks.template.glade:14325 #: share/virtualbricks.template.glade:14780 #: share/virtualbricks.template.glade:14362 #: share/virtualbricks.template.glade:14817 msgid "Re_name" msgstr "" #: share/virtualbricks.template.glade:14333 #: share/virtualbricks.template.glade:14788 #: share/virtualbricks.template.glade:14370 #: share/virtualbricks.template.glade:14825 msgid "_Configure" msgstr "" #: share/virtualbricks.template.glade:14342 #: share/virtualbricks.template.glade:14379 msgid "_Resume VM" msgstr "" #: share/virtualbricks.template.glade:14350 #: share/virtualbricks.template.glade:14387 msgid "_Attach Event" msgstr "" #: share/virtualbricks.template.glade:14390 #: share/virtualbricks.template.glade:14427 msgid "Confirm Action" msgstr "" #: share/virtualbricks.template.glade:14465 #: share/virtualbricks.template.glade:14813 #: share/virtualbricks.template.glade:14502 #: share/virtualbricks.template.glade:14850 msgid "Choose a new name:" msgstr "" #: share/virtualbricks.template.glade:14532 #: share/virtualbricks.template.glade:14569 msgid "Virtualbricks: action in progress" msgstr "" #: share/virtualbricks.template.glade:14547 #: share/virtualbricks.template.glade:14584 msgid "Please wait" msgstr "" #: share/virtualbricks.template.glade:14576 #: share/virtualbricks.template.glade:14613 msgid "Select Image file" msgstr "" #: share/virtualbricks.template.glade:14637 #: share/virtualbricks.template.glade:14674 msgid "Toggle window" msgstr "" #: share/virtualbricks.template.glade:14650 #: share/virtualbricks.template.glade:14687 msgid "Close VB" msgstr "" #: share/virtualbricks.template.glade:14658 #: share/virtualbricks.template.glade:14695 msgid "Shell command actions" msgstr "" #: share/virtualbricks.template.glade:14675 #: share/virtualbricks.template.glade:14712 msgid "" "Enter shell command:\n" "(each line is an action)" msgstr "" #: share/virtualbricks.template.glade:14796 #: share/virtualbricks.template.glade:14833 msgid "New event name" msgstr "" #: share/virtualbricks.template.glade:14881 #: share/virtualbricks.template.glade:14918 msgid "Bricks to add to the event" msgstr "" #: share/virtualbricks.template.glade:14917 #: share/virtualbricks.template.glade:14954 msgid "Bricks available" msgstr "" #: share/virtualbricks.template.glade:14942 #: share/virtualbricks.template.glade:14979 msgid "" "--->\n" "<---" msgstr "" #: share/virtualbricks.template.glade:15013 #: share/virtualbricks.template.glade:15050 msgid "Bricks added" msgstr "" #: share/virtualbricks.template.glade:15077 #: share/virtualbricks.template.glade:15114 msgid "Messages" msgstr "" #: share/virtualbricks.template.glade:15203 #: share/virtualbricks.template.glade:15240 msgid "Start Event selection" msgstr "" #: share/virtualbricks.template.glade:15217 #: share/virtualbricks.template.glade:15282 #: share/virtualbricks.template.glade:15254 #: share/virtualbricks.template.glade:15319 msgid "Assign Nothing" msgstr "" #: share/virtualbricks.template.glade:15268 #: share/virtualbricks.template.glade:15305 msgid "Stop Event selection" msgstr "" #: share/virtualbricks.template.glade:15354 #: share/virtualbricks.template.glade:15391 msgid "Connect/Disconnect" msgstr "" #: share/virtualbricks.template.glade:15362 #: share/virtualbricks.template.glade:15399 msgid "Change Password" msgstr "" #: share/virtualbricks.template.glade:15370 #: share/virtualbricks.template.glade:15407 msgid "Auto-connect at startup" msgstr "" #: share/virtualbricks.template.glade:15378 #: share/virtualbricks.template.glade:15415 msgid "Delete" msgstr "" #: share/virtualbricks.template.glade:15384 #: share/virtualbricks.template.glade:15421 msgid "Authentication" msgstr "" #: share/virtualbricks.template.glade:15397 #: share/virtualbricks.template.glade:15434 msgid "Password for remote virtualbricks session:" msgstr "" #: virtualbricks/brickfactory.py:532 virtualbricks/brickfactory.py:584 #, python-format msgid "Starting: '%s'" msgstr "" #: virtualbricks/brickfactory.py:565 virtualbricks/brickfactory.py:623 #, python-format msgid "Shutting down %s" msgstr "" #: virtualbricks/brickfactory.py:576 #, python-format msgid "can not stop brick (error code: '%s')" msgstr "" #: virtualbricks/brickfactory.py:582 virtualbricks/brickfactory.py:638 #, python-format msgid "can not send SIGTERM: '%s'" msgstr "" #: virtualbricks/brickfactory.py:646 virtualbricks/brickfactory.py:709 msgid "Error: cannot start a terminal emulator" msgstr "" #: virtualbricks/brickfactory.py:651 virtualbricks/brickfactory.py:714 msgid "Error running command line" msgstr "" #: virtualbricks/brickfactory.py:658 virtualbricks/brickfactory.py:721 msgid "does not have a console" msgstr "" #: virtualbricks/brickfactory.py:669 virtualbricks/brickfactory.py:732 msgid "error opening internal console" msgstr "" #: virtualbricks/brickfactory.py:714 virtualbricks/brickfactory.py:771 #: virtualbricks/brickfactory.py:777 virtualbricks/brickfactory.py:834 msgid "running" msgstr "" #: virtualbricks/brickfactory.py:716 virtualbricks/brickfactory.py:1019 #: virtualbricks/brickfactory.py:1081 virtualbricks/brickfactory.py:1086 #: virtualbricks/brickfactory.py:1088 virtualbricks/brickfactory.py:1825 #: virtualbricks/brickfactory.py:1877 virtualbricks/brickfactory.py:779 #: virtualbricks/brickfactory.py:1082 virtualbricks/brickfactory.py:1144 #: virtualbricks/brickfactory.py:1149 virtualbricks/brickfactory.py:1151 #: virtualbricks/brickfactory.py:1888 virtualbricks/brickfactory.py:1940 msgid "disconnected" msgstr "" #: virtualbricks/brickfactory.py:718 virtualbricks/brickfactory.py:775 #: virtualbricks/brickfactory.py:781 virtualbricks/brickfactory.py:838 msgid "off" msgstr "" #: virtualbricks/brickfactory.py:773 virtualbricks/brickfactory.py:836 msgid "unconfigured" msgstr "" #: virtualbricks/brickfactory.py:798 virtualbricks/brickfactory.py:861 msgid "Error: config line must contain add OR addsh." msgstr "" #: virtualbricks/brickfactory.py:806 virtualbricks/brickfactory.py:869 #, python-format msgid "Added vb-shell command: '%s'" msgstr "" #: virtualbricks/brickfactory.py:813 virtualbricks/brickfactory.py:876 #, python-format msgid "Added host-shell command: '%s'" msgstr "" #: virtualbricks/brickfactory.py:956 virtualbricks/brickfactory.py:1019 msgid "Ports:" msgstr "" #: virtualbricks/brickfactory.py:1017 virtualbricks/brickfactory.py:1080 #, python-format msgid "plugged to %s " msgstr "" #: virtualbricks/brickfactory.py:1089 virtualbricks/brickfactory.py:1152 msgid "Configured to connect" msgstr "" #: virtualbricks/brickfactory.py:1091 virtualbricks/brickfactory.py:1154 msgid "Not yet configured." msgstr "" #: virtualbricks/brickfactory.py:1092 virtualbricks/brickfactory.py:1155 msgid "Left plug is" msgstr "" #: virtualbricks/brickfactory.py:1092 virtualbricks/brickfactory.py:1155 msgid "and right plug is" msgstr "" #: virtualbricks/brickfactory.py:1823 virtualbricks/brickfactory.py:1874 #: virtualbricks/brickfactory.py:1886 virtualbricks/brickfactory.py:1937 msgid "plugged to" msgstr "" #: virtualbricks/brickfactory.py:1824 virtualbricks/brickfactory.py:1887 msgid "listening to udp:" msgstr "" #: virtualbricks/brickfactory.py:1875 virtualbricks/brickfactory.py:1938 msgid ", connecting to udp://" msgstr "" #: virtualbricks/brickfactory.py:2146 virtualbricks/brickfactory.py:2209 msgid "command:" msgstr "" #: virtualbricks/brickfactory.py:2781 virtualbricks/brickfactory.py:2857 msgid "Engine: Bye!" msgstr "" #: virtualbricks/gui/gui.py:107 msgid "PID" msgstr "" #: virtualbricks/gui/gui.py:107 virtualbricks/gui/gui.py:109 #: virtualbricks/gui/gui.py:199 virtualbricks/gui/gui.py:221 #: virtualbricks/gui/gui.py:1138 virtualbricks/gui/gui.py:1160 #: virtualbricks/gui/gui.py:2753 virtualbricks/gui/gui.py:2775 #: virtualbricks/gui/gui.py:2726 virtualbricks/gui/gui.py:2748 #: virtualbricks/gui/gui.py:2746 virtualbricks/gui/gui.py:2768 #: virtualbricks/gui/gui.py:2754 virtualbricks/gui/gui.py:2776 #: virtualbricks/gui/gui.py:2761 virtualbricks/gui/gui.py:2783 #: virtualbricks/gui/gui.py:1140 virtualbricks/gui/gui.py:1162 #: virtualbricks/gui/gui.py:2763 virtualbricks/gui/gui.py:2785 #: virtualbricks/gui/gui.py:2765 virtualbricks/gui/gui.py:2787 #: virtualbricks/gui/gui.py:2739 msgid "Type" msgstr "" #: virtualbricks/gui/gui.py:107 virtualbricks/gui/gui.py:109 #: virtualbricks/gui/gui.py:204 virtualbricks/gui/gui.py:223 #: virtualbricks/gui/gui.py:1140 virtualbricks/gui/gui.py:1162 #: virtualbricks/gui/gui.py:2755 virtualbricks/gui/gui.py:2777 #: virtualbricks/gui/gui.py:2728 virtualbricks/gui/gui.py:2750 #: virtualbricks/gui/gui.py:2748 virtualbricks/gui/gui.py:2770 #: virtualbricks/gui/gui.py:2756 virtualbricks/gui/gui.py:2778 #: virtualbricks/gui/gui.py:2763 virtualbricks/gui/gui.py:2785 #: virtualbricks/gui/gui.py:1142 virtualbricks/gui/gui.py:1164 #: virtualbricks/gui/gui.py:2765 virtualbricks/gui/gui.py:2787 #: virtualbricks/gui/gui.py:2767 virtualbricks/gui/gui.py:2789 #: virtualbricks/gui/gui.py:2741 msgid "Name" msgstr "" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:119 #: virtualbricks/gui/gui.py:132 virtualbricks/gui/gui.py:181 #: virtualbricks/gui/gui.py:214 virtualbricks/gui/gui.py:1136 #: virtualbricks/gui/gui.py:1158 virtualbricks/gui/gui.py:2751 #: virtualbricks/gui/gui.py:2773 virtualbricks/gui/gui.py:2724 #: virtualbricks/gui/gui.py:2746 virtualbricks/gui/gui.py:2744 #: virtualbricks/gui/gui.py:2766 virtualbricks/gui/gui.py:2752 #: virtualbricks/gui/gui.py:2774 virtualbricks/gui/gui.py:2759 #: virtualbricks/gui/gui.py:2781 virtualbricks/gui/gui.py:1138 #: virtualbricks/gui/gui.py:1160 virtualbricks/gui/gui.py:2761 #: virtualbricks/gui/gui.py:2783 virtualbricks/gui/gui.py:2763 #: virtualbricks/gui/gui.py:2785 virtualbricks/gui/gui.py:2737 msgid "Icon" msgstr "" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:197 #: virtualbricks/gui/gui.py:219 msgid "Status" msgstr "" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:206 #: virtualbricks/gui/gui.py:225 virtualbricks/gui/gui.py:1142 #: virtualbricks/gui/gui.py:1164 virtualbricks/gui/gui.py:2757 #: virtualbricks/gui/gui.py:2779 virtualbricks/gui/gui.py:2730 #: virtualbricks/gui/gui.py:2752 virtualbricks/gui/gui.py:2750 #: virtualbricks/gui/gui.py:2772 virtualbricks/gui/gui.py:2758 #: virtualbricks/gui/gui.py:2780 virtualbricks/gui/gui.py:2765 #: virtualbricks/gui/gui.py:2787 virtualbricks/gui/gui.py:1144 #: virtualbricks/gui/gui.py:1166 virtualbricks/gui/gui.py:2767 #: virtualbricks/gui/gui.py:2789 virtualbricks/gui/gui.py:2769 #: virtualbricks/gui/gui.py:2791 virtualbricks/gui/gui.py:2743 msgid "Parameters" msgstr "" #: virtualbricks/gui/gui.py:115 msgid "Address" msgstr "" #: virtualbricks/gui/gui.py:115 msgid "Autoconnect" msgstr "" #: virtualbricks/gui/gui.py:332 virtualbricks/gui/gui.py:1091 #: virtualbricks/gui/gui.py:1093 msgid "Command" msgstr "" #: virtualbricks/gui/gui.py:336 virtualbricks/gui/gui.py:1095 #: virtualbricks/gui/gui.py:1097 msgid "Host shell command" msgstr "" #: virtualbricks/gui/gui.py:443 msgid "KVM is disabled from Properties" msgstr "" #: virtualbricks/gui/gui.py:729 msgid "Show Settings" msgstr "" #: virtualbricks/gui/gui.py:755 virtualbricks/gui/gui.py:792 msgid "Hide Settings" msgstr "" #: virtualbricks/gui/gui.py:1038 virtualbricks/gui/gui.py:1045 #: virtualbricks/gui/gui.py:1040 virtualbricks/gui/gui.py:1047 msgid "Cannot create brick: Invalid name." msgstr "" #: virtualbricks/gui/gui.py:1062 virtualbricks/gui/gui.py:1066 #: virtualbricks/gui/gui.py:1064 virtualbricks/gui/gui.py:1068 msgid "The name \"" msgstr "" #: virtualbricks/gui/gui.py:1062 virtualbricks/gui/gui.py:1064 msgid "\" has forbidden format." msgstr "" #: virtualbricks/gui/gui.py:1066 virtualbricks/gui/gui.py:1068 msgid "\" has been adapted to \"" msgstr "" #: virtualbricks/gui/gui.py:1070 virtualbricks/gui/gui.py:1072 msgid "An event named \"" msgstr "" #: virtualbricks/gui/gui.py:1070 virtualbricks/gui/gui.py:1072 msgid "\" already exist." msgstr "" #: virtualbricks/gui/gui.py:1174 virtualbricks/gui/gui.py:1176 msgid "Bricks to add to the event to be started" msgstr "" #: virtualbricks/gui/gui.py:1178 virtualbricks/gui/gui.py:1180 msgid "Bricks to add to the event to be stopped" msgstr "" #: virtualbricks/gui/gui.py:1182 virtualbricks/gui/gui.py:1184 msgid "Events to add to the event to be started" msgstr "" #: virtualbricks/gui/gui.py:1187 virtualbricks/gui/gui.py:1189 msgid "Cannot create event: Invalid name." msgstr "" #: virtualbricks/gui/gui.py:1311 virtualbricks/gui/gui.py:1313 msgid "Help for parameter:" msgstr "" #: virtualbricks/gui/gui.py:1316 msgid "\t\tCHANNEL BANDWIDTH\n" msgstr "" #: virtualbricks/gui/gui.py:1326 msgid "\t\tINTERFACE SPEED\n" msgstr "" #: virtualbricks/gui/gui.py:1336 msgid "\t\tDELAY\n" msgstr "" #: virtualbricks/gui/gui.py:1346 virtualbricks/gui/gui.py:1339 msgid "\t\tCHANNEL BUFFER SIZE\n" msgstr "" #: virtualbricks/gui/gui.py:1355 virtualbricks/gui/gui.py:1328 #: virtualbricks/gui/gui.py:1348 msgid "\t\tPACKET LOSS\n" msgstr "" #: virtualbricks/gui/gui.py:1363 virtualbricks/gui/gui.py:1336 #: virtualbricks/gui/gui.py:1356 msgid "\t\tPACKET DUPLICATION\n" msgstr "" #: virtualbricks/gui/gui.py:1372 virtualbricks/gui/gui.py:1345 #: virtualbricks/gui/gui.py:1365 msgid "\t\tNOISE\n" msgstr "" #: virtualbricks/gui/gui.py:1380 virtualbricks/gui/gui.py:1353 #: virtualbricks/gui/gui.py:1373 msgid "\t\tLOST BURST\n" msgstr "" #: virtualbricks/gui/gui.py:1389 virtualbricks/gui/gui.py:1362 #: virtualbricks/gui/gui.py:1382 msgid "\t\tMTU: MAXIMUM TRANSMISSION UNIT\n" msgstr "" #: virtualbricks/gui/gui.py:1613 virtualbricks/gui/gui.py:1586 #: virtualbricks/gui/gui.py:1606 virtualbricks/gui/gui.py:1614 #: virtualbricks/gui/gui.py:1621 virtualbricks/gui/gui.py:1623 #: virtualbricks/gui/gui.py:1625 virtualbricks/gui/gui.py:1599 #, python-format msgid "Cannot start '%s': not configured" msgstr "" #: virtualbricks/gui/gui.py:1618 virtualbricks/gui/gui.py:1591 #: virtualbricks/gui/gui.py:1611 virtualbricks/gui/gui.py:1619 #: virtualbricks/gui/gui.py:1626 virtualbricks/gui/gui.py:1628 #: virtualbricks/gui/gui.py:1630 virtualbricks/gui/gui.py:1604 #, python-format msgid "Cannot start '%s': not connected" msgstr "" #: virtualbricks/gui/gui.py:1624 virtualbricks/gui/gui.py:1597 #: virtualbricks/gui/gui.py:1617 virtualbricks/gui/gui.py:1625 #: virtualbricks/gui/gui.py:1632 virtualbricks/gui/gui.py:1634 #: virtualbricks/gui/gui.py:1636 virtualbricks/gui/gui.py:1610 msgid "" "Loop link detected: aborting operation. If you want to start a looped " "network, disable the check loop feature in the general settings" msgstr "" #: virtualbricks/gui/gui.py:1632 virtualbricks/gui/gui.py:1605 #: virtualbricks/gui/gui.py:1625 virtualbricks/gui/gui.py:1633 #: virtualbricks/gui/gui.py:1640 virtualbricks/gui/gui.py:1642 #: virtualbricks/gui/gui.py:1644 virtualbricks/gui/gui.py:1618 msgid "Disk used by the VM is locked by another machine" msgstr "" #: virtualbricks/gui/gui.py:1906 virtualbricks/gui/gui.py:1879 #: virtualbricks/gui/gui.py:1899 virtualbricks/gui/gui.py:1907 #: virtualbricks/gui/gui.py:1914 virtualbricks/gui/gui.py:1916 #: virtualbricks/gui/gui.py:1918 virtualbricks/gui/gui.py:1892 msgid "Choose a filename first!" msgstr "" #: virtualbricks/gui/gui.py:2095 virtualbricks/gui/gui.py:2068 #: virtualbricks/gui/gui.py:2088 virtualbricks/gui/gui.py:2096 #: virtualbricks/gui/gui.py:2103 virtualbricks/gui/gui.py:2105 #: virtualbricks/gui/gui.py:2107 virtualbricks/gui/gui.py:2081 msgid "No KVM binary found" msgstr "" #: virtualbricks/gui/gui.py:2095 virtualbricks/gui/gui.py:2098 #: virtualbricks/gui/gui.py:2068 virtualbricks/gui/gui.py:2071 #: virtualbricks/gui/gui.py:2088 virtualbricks/gui/gui.py:2091 #: virtualbricks/gui/gui.py:2096 virtualbricks/gui/gui.py:2099 #: virtualbricks/gui/gui.py:2103 virtualbricks/gui/gui.py:2106 #: virtualbricks/gui/gui.py:2105 virtualbricks/gui/gui.py:2108 #: virtualbricks/gui/gui.py:2107 virtualbricks/gui/gui.py:2110 #: virtualbricks/gui/gui.py:2081 virtualbricks/gui/gui.py:2084 msgid "Check your active configuration" msgstr "" #: virtualbricks/gui/gui.py:2095 virtualbricks/gui/gui.py:2098 #: virtualbricks/gui/gui.py:2068 virtualbricks/gui/gui.py:2071 #: virtualbricks/gui/gui.py:2088 virtualbricks/gui/gui.py:2091 #: virtualbricks/gui/gui.py:2096 virtualbricks/gui/gui.py:2099 #: virtualbricks/gui/gui.py:2103 virtualbricks/gui/gui.py:2106 #: virtualbricks/gui/gui.py:2105 virtualbricks/gui/gui.py:2108 #: virtualbricks/gui/gui.py:2107 virtualbricks/gui/gui.py:2110 #: virtualbricks/gui/gui.py:2081 virtualbricks/gui/gui.py:2084 msgid "KVM will stay disabled" msgstr "" #: virtualbricks/gui/gui.py:2098 virtualbricks/gui/gui.py:2071 #: virtualbricks/gui/gui.py:2091 virtualbricks/gui/gui.py:2099 #: virtualbricks/gui/gui.py:2106 virtualbricks/gui/gui.py:2108 #: virtualbricks/gui/gui.py:2110 virtualbricks/gui/gui.py:2084 msgid "No KVM support found on the system" msgstr "" #: virtualbricks/gui/gui.py:2106 virtualbricks/gui/gui.py:2079 #: virtualbricks/gui/gui.py:2099 virtualbricks/gui/gui.py:2107 #: virtualbricks/gui/gui.py:2114 virtualbricks/gui/gui.py:2116 #: virtualbricks/gui/gui.py:2118 virtualbricks/gui/gui.py:2092 msgid "No KSM support found on the system" msgstr "" #: virtualbricks/gui/gui.py:2106 virtualbricks/gui/gui.py:2079 #: virtualbricks/gui/gui.py:2099 virtualbricks/gui/gui.py:2107 #: virtualbricks/gui/gui.py:2114 virtualbricks/gui/gui.py:2116 #: virtualbricks/gui/gui.py:2118 virtualbricks/gui/gui.py:2092 msgid "Check your configuration" msgstr "" #: virtualbricks/gui/gui.py:2106 virtualbricks/gui/gui.py:2079 #: virtualbricks/gui/gui.py:2099 virtualbricks/gui/gui.py:2107 #: virtualbricks/gui/gui.py:2114 virtualbricks/gui/gui.py:2116 #: virtualbricks/gui/gui.py:2118 virtualbricks/gui/gui.py:2092 msgid "KSM will stay disabled" msgstr "" #: virtualbricks/gui/gui.py:2120 virtualbricks/gui/gui.py:2093 #: virtualbricks/gui/gui.py:2113 virtualbricks/gui/gui.py:2121 #: virtualbricks/gui/gui.py:2128 virtualbricks/gui/gui.py:2130 #: virtualbricks/gui/gui.py:2132 virtualbricks/gui/gui.py:2106 msgid "The brick is still running, it will be killed before being deleted!\n" msgstr "" #: virtualbricks/gui/gui.py:2122 virtualbricks/gui/gui.py:2095 #: virtualbricks/gui/gui.py:2115 virtualbricks/gui/gui.py:2123 #: virtualbricks/gui/gui.py:2130 virtualbricks/gui/gui.py:2132 #: virtualbricks/gui/gui.py:2134 virtualbricks/gui/gui.py:2108 msgid "Do you really want to delete " msgstr "" #: virtualbricks/gui/gui.py:2131 virtualbricks/gui/gui.py:2104 #: virtualbricks/gui/gui.py:2124 virtualbricks/gui/gui.py:2132 #: virtualbricks/gui/gui.py:2139 virtualbricks/gui/gui.py:2141 #: virtualbricks/gui/gui.py:2143 virtualbricks/gui/gui.py:2117 msgid "This event is in use" msgstr "" #: virtualbricks/gui/gui.py:2133 virtualbricks/gui/gui.py:2106 #: virtualbricks/gui/gui.py:2126 virtualbricks/gui/gui.py:2134 #: virtualbricks/gui/gui.py:2141 virtualbricks/gui/gui.py:2143 #: virtualbricks/gui/gui.py:2145 virtualbricks/gui/gui.py:2119 msgid "Do you really want to delete" msgstr "" #: virtualbricks/gui/gui.py:2143 virtualbricks/gui/gui.py:2116 #: virtualbricks/gui/gui.py:2136 virtualbricks/gui/gui.py:2144 #: virtualbricks/gui/gui.py:2151 virtualbricks/gui/gui.py:2153 #: virtualbricks/gui/gui.py:2155 virtualbricks/gui/gui.py:2129 msgid "Cannot rename Brick: it is in use." msgstr "" #: virtualbricks/gui/gui.py:2169 virtualbricks/gui/gui.py:2181 #: virtualbricks/gui/gui.py:2240 virtualbricks/gui/gui.py:2142 #: virtualbricks/gui/gui.py:2154 virtualbricks/gui/gui.py:2213 #: virtualbricks/gui/gui.py:2162 virtualbricks/gui/gui.py:2174 #: virtualbricks/gui/gui.py:2233 virtualbricks/gui/gui.py:2170 #: virtualbricks/gui/gui.py:2182 virtualbricks/gui/gui.py:2241 #: virtualbricks/gui/gui.py:2177 virtualbricks/gui/gui.py:2189 #: virtualbricks/gui/gui.py:2248 virtualbricks/gui/gui.py:2179 #: virtualbricks/gui/gui.py:2191 virtualbricks/gui/gui.py:2250 #: virtualbricks/gui/gui.py:2193 virtualbricks/gui/gui.py:2252 #: virtualbricks/gui/gui.py:2155 virtualbricks/gui/gui.py:2167 #: virtualbricks/gui/gui.py:2226 msgid "Invalid name!" msgstr "" #: virtualbricks/gui/gui.py:2175 virtualbricks/gui/gui.py:2148 #: virtualbricks/gui/gui.py:2168 virtualbricks/gui/gui.py:2176 #: virtualbricks/gui/gui.py:2183 virtualbricks/gui/gui.py:2185 #: virtualbricks/gui/gui.py:2187 virtualbricks/gui/gui.py:2161 msgid "Cannot rename Event: it is in use." msgstr "" #: virtualbricks/gui/gui.py:2286 virtualbricks/gui/gui.py:2295 #: virtualbricks/gui/gui.py:2325 virtualbricks/gui/gui.py:2259 #: virtualbricks/gui/gui.py:2268 virtualbricks/gui/gui.py:2298 #: virtualbricks/gui/gui.py:2279 virtualbricks/gui/gui.py:2288 #: virtualbricks/gui/gui.py:2318 virtualbricks/gui/gui.py:2287 #: virtualbricks/gui/gui.py:2296 virtualbricks/gui/gui.py:2326 #: virtualbricks/gui/gui.py:2294 virtualbricks/gui/gui.py:2303 #: virtualbricks/gui/gui.py:2333 virtualbricks/gui/gui.py:2305 #: virtualbricks/gui/gui.py:2335 virtualbricks/gui/gui.py:2307 #: virtualbricks/gui/gui.py:2337 virtualbricks/gui/gui.py:2272 #: virtualbricks/gui/gui.py:2281 virtualbricks/gui/gui.py:2311 msgid "Error" msgstr "" #: virtualbricks/gui/gui.py:2286 virtualbricks/gui/gui.py:2259 #: virtualbricks/gui/gui.py:2279 virtualbricks/gui/gui.py:2287 #: virtualbricks/gui/gui.py:2294 virtualbricks/gui/gui.py:2296 #: virtualbricks/gui/gui.py:2298 virtualbricks/gui/gui.py:2272 msgid "invalid path for qemu binaries" msgstr "" #: virtualbricks/gui/gui.py:2295 virtualbricks/gui/gui.py:2268 #: virtualbricks/gui/gui.py:2288 virtualbricks/gui/gui.py:2296 #: virtualbricks/gui/gui.py:2303 virtualbricks/gui/gui.py:2305 #: virtualbricks/gui/gui.py:2307 virtualbricks/gui/gui.py:2281 msgid "cannot find neither qemu nor kvm in this path" msgstr "" #: virtualbricks/gui/gui.py:2299 virtualbricks/gui/gui.py:2302 #: virtualbricks/gui/gui.py:2272 virtualbricks/gui/gui.py:2275 #: virtualbricks/gui/gui.py:2292 virtualbricks/gui/gui.py:2295 #: virtualbricks/gui/gui.py:2300 virtualbricks/gui/gui.py:2303 #: virtualbricks/gui/gui.py:2307 virtualbricks/gui/gui.py:2310 #: virtualbricks/gui/gui.py:2309 virtualbricks/gui/gui.py:2312 #: virtualbricks/gui/gui.py:2311 virtualbricks/gui/gui.py:2314 #: virtualbricks/gui/gui.py:2285 virtualbricks/gui/gui.py:2288 msgid "Warning" msgstr "" #: virtualbricks/gui/gui.py:2299 virtualbricks/gui/gui.py:2272 #: virtualbricks/gui/gui.py:2292 virtualbricks/gui/gui.py:2300 #: virtualbricks/gui/gui.py:2307 virtualbricks/gui/gui.py:2309 #: virtualbricks/gui/gui.py:2311 virtualbricks/gui/gui.py:2285 msgid "cannot find qemu, using kvm only\n" msgstr "" #: virtualbricks/gui/gui.py:2302 virtualbricks/gui/gui.py:2275 #: virtualbricks/gui/gui.py:2295 virtualbricks/gui/gui.py:2303 #: virtualbricks/gui/gui.py:2310 virtualbricks/gui/gui.py:2312 #: virtualbricks/gui/gui.py:2314 virtualbricks/gui/gui.py:2288 msgid "kvm not found" msgstr "" #: virtualbricks/gui/gui.py:2302 virtualbricks/gui/gui.py:2275 #: virtualbricks/gui/gui.py:2295 virtualbricks/gui/gui.py:2303 #: virtualbricks/gui/gui.py:2310 virtualbricks/gui/gui.py:2312 #: virtualbricks/gui/gui.py:2314 virtualbricks/gui/gui.py:2288 msgid "KVM support disabled" msgstr "" #: virtualbricks/gui/gui.py:2304 virtualbricks/gui/gui.py:2277 #: virtualbricks/gui/gui.py:2297 virtualbricks/gui/gui.py:2305 #: virtualbricks/gui/gui.py:2312 virtualbricks/gui/gui.py:2314 #: virtualbricks/gui/gui.py:2316 virtualbricks/gui/gui.py:2290 msgid "KVM and Qemu detected" msgstr "" #: virtualbricks/gui/gui.py:2316 virtualbricks/gui/gui.py:2289 #: virtualbricks/gui/gui.py:2309 virtualbricks/gui/gui.py:2317 #: virtualbricks/gui/gui.py:2324 virtualbricks/gui/gui.py:2326 #: virtualbricks/gui/gui.py:2328 virtualbricks/gui/gui.py:2302 msgid "additional targets supported" msgstr "" #: virtualbricks/gui/gui.py:2325 virtualbricks/gui/gui.py:2298 #: virtualbricks/gui/gui.py:2318 virtualbricks/gui/gui.py:2326 #: virtualbricks/gui/gui.py:2333 virtualbricks/gui/gui.py:2335 #: virtualbricks/gui/gui.py:2337 virtualbricks/gui/gui.py:2311 msgid "invalid path for vde binaries" msgstr "" #: virtualbricks/gui/gui.py:2327 virtualbricks/gui/gui.py:2300 #: virtualbricks/gui/gui.py:2320 virtualbricks/gui/gui.py:2328 #: virtualbricks/gui/gui.py:2335 virtualbricks/gui/gui.py:2337 #: virtualbricks/gui/gui.py:2339 virtualbricks/gui/gui.py:2313 msgid "Warning, missing modules" msgstr "" #: virtualbricks/gui/gui.py:2332 virtualbricks/gui/gui.py:2305 #: virtualbricks/gui/gui.py:2325 virtualbricks/gui/gui.py:2333 #: virtualbricks/gui/gui.py:2340 virtualbricks/gui/gui.py:2342 #: virtualbricks/gui/gui.py:2344 virtualbricks/gui/gui.py:2318 msgid "All VDE components detected" msgstr "" #: virtualbricks/gui/gui.py:2398 virtualbricks/gui/gui.py:2371 #: virtualbricks/gui/gui.py:2391 virtualbricks/gui/gui.py:2399 #: virtualbricks/gui/gui.py:2406 virtualbricks/gui/gui.py:2408 #: virtualbricks/gui/gui.py:2410 virtualbricks/gui/gui.py:2384 msgid "" "No KVM binary found. Check your active configuration. KVM will stay disabled." msgstr "" #: virtualbricks/gui/gui.py:2401 virtualbricks/gui/gui.py:2374 #: virtualbricks/gui/gui.py:2394 virtualbricks/gui/gui.py:2402 #: virtualbricks/gui/gui.py:2409 virtualbricks/gui/gui.py:2411 #: virtualbricks/gui/gui.py:2413 virtualbricks/gui/gui.py:2387 msgid "" "No KVM support found on the system. Check your active configuration. KVM " "will stay disabled." msgstr "" #: virtualbricks/gui/gui.py:2572 virtualbricks/gui/gui.py:2545 #: virtualbricks/gui/gui.py:2565 virtualbricks/gui/gui.py:2573 #: virtualbricks/gui/gui.py:2580 virtualbricks/gui/gui.py:2582 #: virtualbricks/gui/gui.py:2584 virtualbricks/gui/gui.py:2558 msgid "Suspend/Resume not supported on this disk." msgstr "" #: virtualbricks/gui/gui.py:2597 virtualbricks/gui/gui.py:2570 #: virtualbricks/gui/gui.py:2590 virtualbricks/gui/gui.py:2598 #: virtualbricks/gui/gui.py:2605 virtualbricks/gui/gui.py:2607 #: virtualbricks/gui/gui.py:2609 virtualbricks/gui/gui.py:2583 msgid "Cannot find suspend point." msgstr "" #: virtualbricks/gui/gui.py:2629 virtualbricks/gui/gui.py:2602 #: virtualbricks/gui/gui.py:2622 virtualbricks/gui/gui.py:2630 #: virtualbricks/gui/gui.py:2637 virtualbricks/gui/gui.py:2639 #: virtualbricks/gui/gui.py:2641 virtualbricks/gui/gui.py:2615 msgid "Error saving topology: Invalid image format" msgstr "" #: virtualbricks/gui/gui.py:2631 virtualbricks/gui/gui.py:2604 #: virtualbricks/gui/gui.py:2624 virtualbricks/gui/gui.py:2632 #: virtualbricks/gui/gui.py:2639 virtualbricks/gui/gui.py:2641 #: virtualbricks/gui/gui.py:2643 virtualbricks/gui/gui.py:2617 msgid "Error saving topology: Could not write file" msgstr "" #: virtualbricks/gui/gui.py:2633 virtualbricks/gui/gui.py:2606 #: virtualbricks/gui/gui.py:2626 virtualbricks/gui/gui.py:2634 #: virtualbricks/gui/gui.py:2641 virtualbricks/gui/gui.py:2643 #: virtualbricks/gui/gui.py:2645 virtualbricks/gui/gui.py:2619 msgid "Error saving topology: Unknown error" msgstr "" #: virtualbricks/gui/gui.py:2788 virtualbricks/gui/gui.py:2761 #: virtualbricks/gui/gui.py:2781 virtualbricks/gui/gui.py:2789 #: virtualbricks/gui/gui.py:2796 virtualbricks/gui/gui.py:2798 #: virtualbricks/gui/gui.py:2800 virtualbricks/gui/gui.py:2774 msgid "Virtualbricks-Events to attach to the start/stop Brick Events" msgstr "" #: virtualbricks/gui/gui.py:2794 virtualbricks/gui/gui.py:2767 #: virtualbricks/gui/gui.py:2787 virtualbricks/gui/gui.py:2795 #: virtualbricks/gui/gui.py:2802 virtualbricks/gui/gui.py:2804 #: virtualbricks/gui/gui.py:2806 virtualbricks/gui/gui.py:2780 msgid "Save current project?" msgstr "" #: virtualbricks/gui/gui.py:2797 virtualbricks/gui/gui.py:2770 #: virtualbricks/gui/gui.py:2790 virtualbricks/gui/gui.py:2798 #: virtualbricks/gui/gui.py:2805 virtualbricks/gui/gui.py:2807 #: virtualbricks/gui/gui.py:2809 virtualbricks/gui/gui.py:2783 msgid "Open a project" msgstr "" #: virtualbricks/gui/gui.py:2800 virtualbricks/gui/gui.py:2820 #: virtualbricks/gui/gui.py:2850 virtualbricks/gui/gui.py:2773 #: virtualbricks/gui/gui.py:2793 virtualbricks/gui/gui.py:2823 #: virtualbricks/gui/gui.py:2813 virtualbricks/gui/gui.py:2843 #: virtualbricks/gui/gui.py:2801 virtualbricks/gui/gui.py:2821 #: virtualbricks/gui/gui.py:2851 virtualbricks/gui/gui.py:2808 #: virtualbricks/gui/gui.py:2828 virtualbricks/gui/gui.py:2858 #: virtualbricks/gui/gui.py:2810 virtualbricks/gui/gui.py:2830 #: virtualbricks/gui/gui.py:2860 virtualbricks/gui/gui.py:2812 #: virtualbricks/gui/gui.py:2832 virtualbricks/gui/gui.py:2862 #: virtualbricks/gui/gui.py:2786 virtualbricks/gui/gui.py:2806 #: virtualbricks/gui/gui.py:2836 msgid "Virtualbricks Bricks List" msgstr "" #: virtualbricks/gui/gui.py:2804 virtualbricks/gui/gui.py:2824 #: virtualbricks/gui/gui.py:2854 virtualbricks/gui/gui.py:2777 #: virtualbricks/gui/gui.py:2797 virtualbricks/gui/gui.py:2827 #: virtualbricks/gui/gui.py:2817 virtualbricks/gui/gui.py:2847 #: virtualbricks/gui/gui.py:2805 virtualbricks/gui/gui.py:2825 #: virtualbricks/gui/gui.py:2855 virtualbricks/gui/gui.py:2812 #: virtualbricks/gui/gui.py:2832 virtualbricks/gui/gui.py:2862 #: virtualbricks/gui/gui.py:2814 virtualbricks/gui/gui.py:2834 #: virtualbricks/gui/gui.py:2864 virtualbricks/gui/gui.py:2816 #: virtualbricks/gui/gui.py:2836 virtualbricks/gui/gui.py:2866 #: virtualbricks/gui/gui.py:2790 virtualbricks/gui/gui.py:2810 #: virtualbricks/gui/gui.py:2840 msgid "All files" msgstr "" #: virtualbricks/gui/gui.py:2816 virtualbricks/gui/gui.py:2789 #: virtualbricks/gui/gui.py:2809 virtualbricks/gui/gui.py:2817 #: virtualbricks/gui/gui.py:2824 virtualbricks/gui/gui.py:2826 #: virtualbricks/gui/gui.py:2828 virtualbricks/gui/gui.py:2802 msgid "Save as..." msgstr "" #: virtualbricks/gui/gui.py:2846 virtualbricks/gui/gui.py:2819 #: virtualbricks/gui/gui.py:2839 virtualbricks/gui/gui.py:2847 #: virtualbricks/gui/gui.py:2854 virtualbricks/gui/gui.py:2856 #: virtualbricks/gui/gui.py:2858 virtualbricks/gui/gui.py:2832 msgid "New project" msgstr "" #: virtualbricks/settings.py:86 #, python-format msgid "Configuration loaded ('%s')" msgstr "" #: virtualbricks/settings.py:88 msgid "Cannot read config file " msgstr "" #: virtualbricks/settings.py:90 msgid "Default configuration loaded" msgstr "" #: virtualbricks/settings.py:94 #, python-format msgid "Default configuration saved ('%s')" msgstr "" #: virtualbricks/settings.py:97 msgid "Cannot save default configuration" msgstr "" #: virtualbricks/gui/gui.py:1316 #, python-format msgid "" "\t\tCHANNEL BANDWIDTH\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1326 virtualbricks/gui/gui.py:1319 #, python-format msgid "" "\t\tINTERFACE SPEED\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1336 virtualbricks/gui/gui.py:1322 #, python-format msgid "" "\t\tDELAY\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1325 #, python-format msgid "" "\t\tCHANNEL BUFFER SIZE\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1316 #, python-format msgid "" "\t\tCHANNEL BANDWIDTH\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10\\% for a base value " "of 100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98\\% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1319 #, python-format msgid "" "\t\tINTERFACE SPEED\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10\\% for a base value " "of 100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98\\% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1329 #, python-format msgid "" "\t\tDELAY\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10\\% for a base value " "of 100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98\\% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1316 #, python-format msgid "" "\t\tCHANNEL BANDWIDTH\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1319 virtualbricks/gui/gui.py:1320 #: virtualbricks/gui/gui.py:1327 #, python-format msgid "" "\t\tINTERFACE SPEED\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1329 virtualbricks/gui/gui.py:1331 #: virtualbricks/gui/gui.py:1338 #, python-format msgid "" "\t\tDELAY\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1342 virtualbricks/gui/gui.py:1349 #, python-format msgid "" "\t\tCHANNEL BUFFER SIZE\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1352 virtualbricks/gui/gui.py:1359 #, python-format msgid "" "\t\tPACKET LOSS\n" "Percentage of loss as a floating point number.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1361 virtualbricks/gui/gui.py:1368 #, python-format msgid "" "\t\tPACKET DUPLICATION\n" "Percentage of dup packet. Do not use dup factor 100%% because it means that " "each packet is sent infinite times.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1371 virtualbricks/gui/gui.py:1378 #, python-format msgid "" "\t\tNOISE\n" "Number of bits damaged/one megabyte (megabit).\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1380 virtualbricks/gui/gui.py:1387 #, python-format msgid "" "\t\tLOST BURST\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1390 virtualbricks/gui/gui.py:1397 msgid "" "\t\tMTU: MAXIMUM TRANSMISSION UNIT\n" "Packets longer than specified size are discarded." msgstr "" #: share/virtualbricks.template.glade:1833 msgid "Number of CPUs:" msgstr "" #: virtualbricks/brickfactory.py:641 msgid "can not stop brick error code:" msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1329 #, python-format msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1340 #, python-format msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1351 #, python-format msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1361 virtualbricks/gui/gui.py:1363 #, python-format msgid "" "\t\t\tPACKET LOSS\n" "\n" "Percentage of loss as a floating point number.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1370 virtualbricks/gui/gui.py:1372 msgid "" "\t\t\tPACKET DUPLICATION\n" "\n" "Percentage of dup packet. Do not use dup factor 100% because it means that " "each packet is sent infinite times.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1380 virtualbricks/gui/gui.py:1382 #, python-format msgid "" "\t\t\tNOISE\n" "\n" "Number of bits damaged/one megabyte (megabit).\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1389 virtualbricks/gui/gui.py:1391 #, python-format msgid "" "\t\t\tLOST BURST\n" "\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts.\n" "Jitter is the variation from the base value. Jitter 10% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1399 virtualbricks/gui/gui.py:1401 #: virtualbricks/gui/gui.py:1382 virtualbricks/gui/gui.py:1375 msgid "" "\t\t\tMTU: MAXIMUM TRANSMISSION UNIT\n" "\n" "Packets longer than specified size are discarded." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1329 virtualbricks/gui/gui.py:1331 #, python-format msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1340 virtualbricks/gui/gui.py:1342 #, python-format msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1351 virtualbricks/gui/gui.py:1353 #, python-format msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98%% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10\\% for a base value " "of 100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98\\% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10\\u0025 for a base " "value of 100 means the final value goes from 90 to 110. The distribution can " "be Uniform or Gaussian normal (more than 98\\% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value. Jitter 10%% for a base value of " "100 means the final value goes from 90 to 110. The distribution can be " "Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1317 #, python-format msgid "" "Jitter 10% for a base value of 100 means the final value goes from 90 to " "110. The distribution can be Uniform or Gaussian normal (more than 98% of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1323 virtualbricks/gui/gui.py:1325 msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path).\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1317 #, python-format msgid "" "Jitter 10%% for a base value of 100 means the final value goes from 90 to " "110. The distribution can be Uniform or Gaussian normal (more than 98%% of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "Jitter 10 percent for a base value of 100 means the final value goes from 90 " "to 110. The distribution can be Uniform or Gaussian normal (more than 98% of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1333 msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1341 msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1349 msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1356 msgid "" "\t\t\tPACKET LOSS\n" "\n" "Percentage of loss as a floating point number.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1362 msgid "" "\t\t\tPACKET DUPLICATION\n" "\n" "Percentage of dup packet. Do not use dup factor 100% because it means that " "each packet is sent infinite times.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1369 msgid "" "\t\t\tNOISE\n" "\n" "Number of bits damaged/one megabyte (megabit).\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1375 msgid "" "\t\t\tLOST BURST\n" "\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts.\n" "Jitter is the variation from the base value." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "Jitter 10 %% percent for a base value of 100 means the final value goes from " "90 to 110. The distribution can be Uniform or Gaussian normal (more than " "98% of the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 msgid "" "Jitter 10 % percent for a base value of 100 means the final value goes from " "90 to 110. The distribution can be Uniform or Gaussian normal (more than 98% " "of the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "Jitter 10 % for a base value of 100 means the final value goes from 90 to " "110. The distribution can be Uniform or Gaussian normal (more than 98 % of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "Jitter 10 %% for a base value of 100 means the final value goes from 90 to " "110. The distribution can be Uniform or Gaussian normal (more than 98 %% of " "the values are inside the limits)." msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\n" "Jitter is the variation from the base value. Jitter 10 percent for a base " "value of 100 means the final value goes from 90 to 110. The distribution can " "be Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1326 msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path)." msgstr "" #: virtualbricks/gui/gui.py:1333 msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth." msgstr "" #: virtualbricks/gui/gui.py:1340 msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay." msgstr "" #: virtualbricks/gui/gui.py:1347 msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded." msgstr "" #: virtualbricks/gui/gui.py:1353 msgid "" "\t\t\tPACKET LOSS\n" "\n" "Percentage of loss as a floating point number." msgstr "" #: virtualbricks/gui/gui.py:1358 msgid "" "\t\t\tPACKET DUPLICATION\n" "\n" "Percentage of dup packet. Do not use dup factor 100% because it means that " "each packet is sent infinite times." msgstr "" #: virtualbricks/gui/gui.py:1364 msgid "" "\t\t\tNOISE\n" "\n" "Number of bits damaged/one megabyte (megabit)." msgstr "" #: virtualbricks/gui/gui.py:1369 msgid "" "\t\t\tLOST BURST\n" "\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts." msgstr "" virtualbricks-1.0.2/locale/virtualbricks/virtualbricks.pot000066400000000000000000001455311262207653100241460ustar00rootroot00000000000000# 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 , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: virtualbricks 0.4\n" "Report-Msgid-Bugs-To: qemulator-list@createweb.de\n" "POT-Creation-Date: 2011-06-01 22:47+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: share/virtualbricks.template.glade:10 msgid "Virtualbricks" msgstr "" #: share/virtualbricks.template.glade:27 msgid "_File" msgstr "" #: share/virtualbricks.template.glade:33 msgid "_Open Project" msgstr "" #: share/virtualbricks.template.glade:48 msgid "_Recent Projects..." msgstr "" #: share/virtualbricks.template.glade:68 msgid "Restart with _empty project" msgstr "" #: share/virtualbricks.template.glade:83 msgid "_Import bricks" msgstr "" #: share/virtualbricks.template.glade:98 msgid "_Save project as..." msgstr "" #: share/virtualbricks.template.glade:132 msgid "_Settings" msgstr "" #: share/virtualbricks.template.glade:140 msgid "configure Virtualbricks" msgstr "" #: share/virtualbricks.template.glade:150 msgid "auto show empty settings" msgstr "" #: share/virtualbricks.template.glade:159 msgid "auto hide stored settings" msgstr "" #: share/virtualbricks.template.glade:171 msgid "_View" msgstr "" #: share/virtualbricks.template.glade:179 msgid "_Messages" msgstr "" #: share/virtualbricks.template.glade:191 msgid "_Image creation" msgstr "" #: share/virtualbricks.template.glade:198 msgid "Not implemented yet" msgstr "" #: share/virtualbricks.template.glade:199 msgid "_Create new image" msgstr "" #: share/virtualbricks.template.glade:211 msgid "_Help" msgstr "" #: share/virtualbricks.template.glade:218 msgid "About Virtualbricks and QEMU" msgstr "" #: share/virtualbricks.template.glade:219 msgid "_About" msgstr "" #: share/virtualbricks.template.glade:271 msgid "Bricks:" msgstr "" #: share/virtualbricks.template.glade:298 msgid "New Brick" msgstr "" #: share/virtualbricks.template.glade:320 msgid "Start All Bricks" msgstr "" #: share/virtualbricks.template.glade:334 msgid "Stop All Bricks" msgstr "" #: share/virtualbricks.template.glade:361 msgid "" "You can use drag and drop to connect bricks and double click to start/stop " "them." msgstr "" #: share/virtualbricks.template.glade:378 virtualbricks/gui/gui.py:115 msgid "Bricks" msgstr "" #: share/virtualbricks.template.glade:396 msgid "New Event" msgstr "" #: share/virtualbricks.template.glade:418 msgid "Start All Events" msgstr "" #: share/virtualbricks.template.glade:432 msgid "Stop All Events" msgstr "" #: share/virtualbricks.template.glade:459 msgid "" "You can use drag and drop to add an event to events collation and double " "click to start/stop them." msgstr "" #: share/virtualbricks.template.glade:477 msgid "Events" msgstr "" #: share/virtualbricks.template.glade:494 msgid "" "Click to select an enty for use or edit its configuration, rightclick for " "more." msgstr "" #: share/virtualbricks.template.glade:508 msgid "Running" msgstr "" #: share/virtualbricks.template.glade:526 msgid "Add host:" msgstr "" #: share/virtualbricks.template.glade:601 msgid "Remote Sessions" msgstr "" #: share/virtualbricks.template.glade:637 msgid "Export as Image" msgstr "" #: share/virtualbricks.template.glade:653 msgid "Expand Horizontally" msgstr "" #: share/virtualbricks.template.glade:668 msgid "Expand Vertically" msgstr "" #: share/virtualbricks.template.glade:725 msgid "Topology" msgstr "" #: share/virtualbricks.template.glade:744 msgid "Show/hide configuration panel for selected boot image" msgstr "" #: share/virtualbricks.template.glade:769 msgid "Show settings" msgstr "" #: share/virtualbricks.template.glade:839 msgid "boot as device" msgstr "" #: share/virtualbricks.template.glade:871 msgid "Snapshot mode" msgstr "" #: share/virtualbricks.template.glade:876 msgid "write to temporary files instead of disk image files" msgstr "" #: share/virtualbricks.template.glade:902 msgid "boot options" msgstr "" #: share/virtualbricks.template.glade:931 msgid "use image as cdrom" msgstr "" #: share/virtualbricks.template.glade:936 msgid "use one of the image files in the default folder as cdrom device" msgstr "" #: share/virtualbricks.template.glade:951 msgid "mount cdrom" msgstr "" #: share/virtualbricks.template.glade:956 msgid "mount local cdrom Drive" msgstr "" #: share/virtualbricks.template.glade:970 msgid "no cdrom" msgstr "" #: share/virtualbricks.template.glade:975 msgid "don´t use any cdrom device" msgstr "" #: share/virtualbricks.template.glade:990 msgid "/dev/cdrom\n" msgstr "" #: share/virtualbricks.template.glade:1062 msgid "cdrom device" msgstr "" #: share/virtualbricks.template.glade:1110 msgid "Select images for Qemu volumes" msgstr "" #: share/virtualbricks.template.glade:1134 #: share/virtualbricks.template.glade:12354 msgid "fdb" msgstr "" #: share/virtualbricks.template.glade:1148 #: share/virtualbricks.template.glade:12339 msgid "fda" msgstr "" #: share/virtualbricks.template.glade:1162 msgid "hdd" msgstr "" #: share/virtualbricks.template.glade:1176 msgid "hdc" msgstr "" #: share/virtualbricks.template.glade:1190 msgid "hdb" msgstr "" #: share/virtualbricks.template.glade:1204 msgid "hda" msgstr "" #: share/virtualbricks.template.glade:1315 msgid "mtdblock" msgstr "" #: share/virtualbricks.template.glade:1360 #: share/virtualbricks.template.glade:1401 #: share/virtualbricks.template.glade:1444 #: share/virtualbricks.template.glade:1487 #: share/virtualbricks.template.glade:1530 #: share/virtualbricks.template.glade:1573 #: share/virtualbricks.template.glade:1616 msgid "Private COW" msgstr "" #: share/virtualbricks.template.glade:1648 msgid "additional media" msgstr "" #: share/virtualbricks.template.glade:1685 #: share/virtualbricks.template.glade:12420 msgid "Drives" msgstr "" #: share/virtualbricks.template.glade:1723 msgid "Architecture: " msgstr "" #: share/virtualbricks.template.glade:1752 #: share/virtualbricks.template.glade:1802 msgid "\n" msgstr "" #: share/virtualbricks.template.glade:1764 msgid "CPU Type" msgstr "" #: share/virtualbricks.template.glade:1776 msgid "" "\n" "\n" msgstr "" #: share/virtualbricks.template.glade:1790 msgid "Machine type" msgstr "" #: share/virtualbricks.template.glade:1816 msgid "KVM" msgstr "" #: share/virtualbricks.template.glade:1833 msgid "Number of CPUs:" msgstr "" #: share/virtualbricks.template.glade:1870 msgid "System and machine" msgstr "" #: share/virtualbricks.template.glade:1928 msgid "disable graphical output" msgstr "" #: share/virtualbricks.template.glade:1933 msgid "disable graphical output and redirect serial I/Os to console" msgstr "" #: share/virtualbricks.template.glade:1960 msgid "Use VGA instead of Default" msgstr "" #: share/virtualbricks.template.glade:1965 msgid "" "simulate a standard VGA card with VESA Bochs Extensions (default is CL-" "GD5446 PCI VGA)" msgstr "" #: share/virtualbricks.template.glade:1980 msgid "Start in vncserver" msgstr "" #: share/virtualbricks.template.glade:1985 msgid "start emulation in a VNC server on display" msgstr "" #: share/virtualbricks.template.glade:1999 msgid "on Display: " msgstr "" #: share/virtualbricks.template.glade:2011 msgid "select Dsiplay for VNC server" msgstr "" #: share/virtualbricks.template.glade:2029 msgid "SDL" msgstr "" #: share/virtualbricks.template.glade:2041 msgid "Portrait" msgstr "" #: share/virtualbricks.template.glade:2063 msgid "Display Options" msgstr "" #: share/virtualbricks.template.glade:2092 msgid "enable usb" msgstr "" #: share/virtualbricks.template.glade:2097 msgid "enable access to usb" msgstr "" #: share/virtualbricks.template.glade:2128 msgid "USB settings" msgstr "" #: share/virtualbricks.template.glade:2165 msgid "Set realtime clock to local time" msgstr "" #: share/virtualbricks.template.glade:2170 msgid "set the real time clock to local time [default=utc]" msgstr "" #: share/virtualbricks.template.glade:2182 msgid "Guest time drift compensation (TDF)" msgstr "" #: share/virtualbricks.template.glade:2200 msgid "Keyboard: " msgstr "" #: share/virtualbricks.template.glade:2230 msgid "Serial" msgstr "" #: share/virtualbricks.template.glade:2247 msgid "Extra Settings" msgstr "" #: share/virtualbricks.template.glade:2293 msgid "select emulated Soundcard " msgstr "" #: share/virtualbricks.template.glade:2321 #: share/virtualbricks.template.glade:2663 #: share/virtualbricks.template.glade:3500 #: share/virtualbricks.template.glade:3521 #: share/virtualbricks.template.glade:10153 #: share/virtualbricks.template.glade:10174 #: share/virtualbricks.template.glade:10326 #: share/virtualbricks.template.glade:10545 msgid " \n" msgstr "" #: share/virtualbricks.template.glade:2337 msgid "Audio Device Settings" msgstr "" #: share/virtualbricks.template.glade:2366 msgid "Used RAM:" msgstr "" #: share/virtualbricks.template.glade:2392 #: share/virtualbricks.template.glade:2439 msgid " MB" msgstr "" #: share/virtualbricks.template.glade:2410 msgid "KVM Shadow Memory: " msgstr "" #: share/virtualbricks.template.glade:2457 msgid "Memory Settings" msgstr "" #: share/virtualbricks.template.glade:2518 msgid "System" msgstr "" #: share/virtualbricks.template.glade:2544 msgid "Disable networking" msgstr "" #: share/virtualbricks.template.glade:2571 msgid "No Network" msgstr "" #: share/virtualbricks.template.glade:2598 msgid "Start with usermode network (default)" msgstr "" #: share/virtualbricks.template.glade:2624 msgid "Connect to network" msgstr "" #: share/virtualbricks.template.glade:2650 #: share/virtualbricks.template.glade:9938 msgid "Connect to:" msgstr "" #: share/virtualbricks.template.glade:2674 msgid "Virtual ethernet model:" msgstr "" #: share/virtualbricks.template.glade:2685 msgid "" "\n" "rtl8139\n" "e1000\n" "virtio\n" "i82551\n" "i82557b\n" "i82559er\n" "ne2k_pci\n" "pcnet\n" "ne2k_isa\n" msgstr "" #: share/virtualbricks.template.glade:2705 msgid "Mac address:" msgstr "" #: share/virtualbricks.template.glade:2726 msgid "Randomize" msgstr "" #: share/virtualbricks.template.glade:2756 msgid "Set up a new network card" msgstr "" #: share/virtualbricks.template.glade:2783 msgid "Add Network card" msgstr "" #: share/virtualbricks.template.glade:2809 msgid "Edit selected network card or redirection" msgstr "" #: share/virtualbricks.template.glade:2836 msgid "Edit" msgstr "" #: share/virtualbricks.template.glade:2862 msgid "Remove selected network card or redirection" msgstr "" #: share/virtualbricks.template.glade:2890 #: share/virtualbricks.template.glade:11339 msgid "Remove" msgstr "" #: share/virtualbricks.template.glade:2950 msgid "SMB share" msgstr "" #: share/virtualbricks.template.glade:2975 msgid "SMB Share" msgstr "" #: share/virtualbricks.template.glade:3031 msgid "Network cards" msgstr "" #: share/virtualbricks.template.glade:3064 msgid "Network" msgstr "" #: share/virtualbricks.template.glade:3092 msgid "Use a custom kernel" msgstr "" #: share/virtualbricks.template.glade:3105 msgid "Specify initial ramdisk" msgstr "" #: share/virtualbricks.template.glade:3136 msgid "Parameters to append to command line:" msgstr "" #: share/virtualbricks.template.glade:3248 msgid "Enable kernel debugging" msgstr "" #: share/virtualbricks.template.glade:3263 msgid "GNU debugger TCP port:" msgstr "" #: share/virtualbricks.template.glade:3296 msgid "Booting Linux" msgstr "" #: share/virtualbricks.template.glade:3323 msgid "Customize Linux Boot" msgstr "" #: share/virtualbricks.template.glade:3416 msgid "Virtual Machine Icon" msgstr "" #: share/virtualbricks.template.glade:3456 msgid "Others" msgstr "" #: share/virtualbricks.template.glade:3510 #: share/virtualbricks.template.glade:10163 msgid "<=== connect ===>" msgstr "" #: share/virtualbricks.template.glade:3539 msgid "Plugs" msgstr "" #: share/virtualbricks.template.glade:3569 #: share/virtualbricks.template.glade:4293 #: share/virtualbricks.template.glade:5061 #: share/virtualbricks.template.glade:5782 #: share/virtualbricks.template.glade:6525 #: share/virtualbricks.template.glade:7246 #: share/virtualbricks.template.glade:7987 #: share/virtualbricks.template.glade:8712 #: share/virtualbricks.template.glade:9444 msgid "Symmetrical" msgstr "" #: share/virtualbricks.template.glade:3587 #: share/virtualbricks.template.glade:5079 #: share/virtualbricks.template.glade:5800 #: share/virtualbricks.template.glade:6543 #: share/virtualbricks.template.glade:7264 #: share/virtualbricks.template.glade:8005 #: share/virtualbricks.template.glade:8730 #: share/virtualbricks.template.glade:9462 msgid "Multiplier" msgstr "" #: share/virtualbricks.template.glade:3616 #: share/virtualbricks.template.glade:4340 #: share/virtualbricks.template.glade:5106 #: share/virtualbricks.template.glade:5829 #: share/virtualbricks.template.glade:6570 #: share/virtualbricks.template.glade:7291 #: share/virtualbricks.template.glade:8035 #: share/virtualbricks.template.glade:8757 #: share/virtualbricks.template.glade:9491 msgid "UM" msgstr "" #: share/virtualbricks.template.glade:3642 #: share/virtualbricks.template.glade:4366 #: share/virtualbricks.template.glade:5131 #: share/virtualbricks.template.glade:5854 #: share/virtualbricks.template.glade:6595 #: share/virtualbricks.template.glade:7316 #: share/virtualbricks.template.glade:8061 #: share/virtualbricks.template.glade:8782 #: share/virtualbricks.template.glade:9517 msgid "General parameters" msgstr "" #: share/virtualbricks.template.glade:3669 #: share/virtualbricks.template.glade:3856 #: share/virtualbricks.template.glade:4052 #: share/virtualbricks.template.glade:4393 #: share/virtualbricks.template.glade:4580 #: share/virtualbricks.template.glade:4776 #: share/virtualbricks.template.glade:5158 #: share/virtualbricks.template.glade:5345 #: share/virtualbricks.template.glade:5541 #: share/virtualbricks.template.glade:5881 #: share/virtualbricks.template.glade:6068 #: share/virtualbricks.template.glade:6264 #: share/virtualbricks.template.glade:6622 #: share/virtualbricks.template.glade:6809 #: share/virtualbricks.template.glade:7005 #: share/virtualbricks.template.glade:7343 #: share/virtualbricks.template.glade:7530 #: share/virtualbricks.template.glade:7726 #: share/virtualbricks.template.glade:8088 #: share/virtualbricks.template.glade:8275 #: share/virtualbricks.template.glade:8471 #: share/virtualbricks.template.glade:8809 #: share/virtualbricks.template.glade:8996 #: share/virtualbricks.template.glade:9192 #: share/virtualbricks.template.glade:9544 #: share/virtualbricks.template.glade:9614 #: share/virtualbricks.template.glade:9693 msgid "Base" msgstr "" #: share/virtualbricks.template.glade:3708 #: share/virtualbricks.template.glade:3895 #: share/virtualbricks.template.glade:4091 #: share/virtualbricks.template.glade:4432 #: share/virtualbricks.template.glade:4619 #: share/virtualbricks.template.glade:4815 #: share/virtualbricks.template.glade:5197 #: share/virtualbricks.template.glade:5384 #: share/virtualbricks.template.glade:5580 #: share/virtualbricks.template.glade:5920 #: share/virtualbricks.template.glade:6107 #: share/virtualbricks.template.glade:6303 #: share/virtualbricks.template.glade:6661 #: share/virtualbricks.template.glade:6848 #: share/virtualbricks.template.glade:7044 #: share/virtualbricks.template.glade:7382 #: share/virtualbricks.template.glade:7569 #: share/virtualbricks.template.glade:7765 #: share/virtualbricks.template.glade:8127 #: share/virtualbricks.template.glade:8314 #: share/virtualbricks.template.glade:8510 #: share/virtualbricks.template.glade:8848 #: share/virtualbricks.template.glade:9035 #: share/virtualbricks.template.glade:9231 msgid "±" msgstr "" #: share/virtualbricks.template.glade:3729 #: share/virtualbricks.template.glade:3916 #: share/virtualbricks.template.glade:4112 #: share/virtualbricks.template.glade:4453 #: share/virtualbricks.template.glade:4640 #: share/virtualbricks.template.glade:4836 #: share/virtualbricks.template.glade:5218 #: share/virtualbricks.template.glade:5405 #: share/virtualbricks.template.glade:5601 #: share/virtualbricks.template.glade:5941 #: share/virtualbricks.template.glade:6128 #: share/virtualbricks.template.glade:6324 #: share/virtualbricks.template.glade:6682 #: share/virtualbricks.template.glade:6869 #: share/virtualbricks.template.glade:7065 #: share/virtualbricks.template.glade:7403 #: share/virtualbricks.template.glade:7590 #: share/virtualbricks.template.glade:7786 #: share/virtualbricks.template.glade:8148 #: share/virtualbricks.template.glade:8335 #: share/virtualbricks.template.glade:8531 #: share/virtualbricks.template.glade:8869 #: share/virtualbricks.template.glade:9056 #: share/virtualbricks.template.glade:9252 msgid "Jitter" msgstr "" #: share/virtualbricks.template.glade:3768 #: share/virtualbricks.template.glade:3955 #: share/virtualbricks.template.glade:4151 #: share/virtualbricks.template.glade:4492 #: share/virtualbricks.template.glade:4679 #: share/virtualbricks.template.glade:4875 #: share/virtualbricks.template.glade:5257 #: share/virtualbricks.template.glade:5444 #: share/virtualbricks.template.glade:5640 #: share/virtualbricks.template.glade:5980 #: share/virtualbricks.template.glade:6167 #: share/virtualbricks.template.glade:6363 #: share/virtualbricks.template.glade:6721 #: share/virtualbricks.template.glade:6908 #: share/virtualbricks.template.glade:7104 #: share/virtualbricks.template.glade:7442 #: share/virtualbricks.template.glade:7629 #: share/virtualbricks.template.glade:7825 #: share/virtualbricks.template.glade:8187 #: share/virtualbricks.template.glade:8374 #: share/virtualbricks.template.glade:8570 #: share/virtualbricks.template.glade:8908 #: share/virtualbricks.template.glade:9095 #: share/virtualbricks.template.glade:9291 msgid "%" msgstr "" #: share/virtualbricks.template.glade:3788 #: share/virtualbricks.template.glade:3975 #: share/virtualbricks.template.glade:4171 #: share/virtualbricks.template.glade:4895 #: share/virtualbricks.template.glade:5277 #: share/virtualbricks.template.glade:5464 #: share/virtualbricks.template.glade:5660 #: share/virtualbricks.template.glade:6000 #: share/virtualbricks.template.glade:6187 #: share/virtualbricks.template.glade:6383 #: share/virtualbricks.template.glade:6741 #: share/virtualbricks.template.glade:6928 #: share/virtualbricks.template.glade:7124 #: share/virtualbricks.template.glade:7462 #: share/virtualbricks.template.glade:7649 #: share/virtualbricks.template.glade:7845 #: share/virtualbricks.template.glade:8207 #: share/virtualbricks.template.glade:8394 #: share/virtualbricks.template.glade:8590 #: share/virtualbricks.template.glade:8928 #: share/virtualbricks.template.glade:9115 #: share/virtualbricks.template.glade:9311 msgid "Distrib." msgstr "" #: share/virtualbricks.template.glade:3817 #: share/virtualbricks.template.glade:4541 #: share/virtualbricks.template.glade:5306 #: share/virtualbricks.template.glade:6029 #: share/virtualbricks.template.glade:6770 #: share/virtualbricks.template.glade:7491 #: share/virtualbricks.template.glade:8236 #: share/virtualbricks.template.glade:8957 #: share/virtualbricks.template.glade:9575 msgid "Left to Right" msgstr "" #: share/virtualbricks.template.glade:4012 #: share/virtualbricks.template.glade:4736 #: share/virtualbricks.template.glade:5501 #: share/virtualbricks.template.glade:6224 #: share/virtualbricks.template.glade:6965 #: share/virtualbricks.template.glade:7686 #: share/virtualbricks.template.glade:8431 #: share/virtualbricks.template.glade:9152 #: share/virtualbricks.template.glade:9653 msgid "Both Directions" msgstr "" #: share/virtualbricks.template.glade:4209 #: share/virtualbricks.template.glade:4933 #: share/virtualbricks.template.glade:5698 #: share/virtualbricks.template.glade:6421 #: share/virtualbricks.template.glade:7162 #: share/virtualbricks.template.glade:7883 #: share/virtualbricks.template.glade:8628 #: share/virtualbricks.template.glade:9349 #: share/virtualbricks.template.glade:9733 msgid "Right to Left" msgstr "" #: share/virtualbricks.template.glade:4235 msgid "Bandwidth Restriction" msgstr "" #: share/virtualbricks.template.glade:4521 msgid "" "Uniform\n" "Gaussian" msgstr "" #: share/virtualbricks.template.glade:4959 msgid "Interface Speed" msgstr "" #: share/virtualbricks.template.glade:4978 msgid "Enable(advanced)" msgstr "" #: share/virtualbricks.template.glade:5030 msgid "Bandwidth" msgstr "" #: share/virtualbricks.template.glade:5724 msgid "Packet Delay" msgstr "" #: share/virtualbricks.template.glade:6447 msgid "Channel Buffer Size" msgstr "" #: share/virtualbricks.template.glade:6495 virtualbricks/brickfactory.py:885 msgid "Delay" msgstr "" #: share/virtualbricks.template.glade:7188 msgid "Packet Loss" msgstr "" #: share/virtualbricks.template.glade:7909 msgid "Packet Duplication" msgstr "" #: share/virtualbricks.template.glade:7957 msgid "Disruptions 1/3" msgstr "" #: share/virtualbricks.template.glade:8654 msgid "Noise" msgstr "" #: share/virtualbricks.template.glade:9375 msgid "Lost Burst" msgstr "" #: share/virtualbricks.template.glade:9413 msgid "Disruptions 2/3" msgstr "" #: share/virtualbricks.template.glade:9759 msgid "Maximum Transmission Unit (MTU)" msgstr "" #: share/virtualbricks.template.glade:9801 msgid "Disruptions 3/3" msgstr "" #: share/virtualbricks.template.glade:9837 msgid "Number of ports: " msgstr "" #: share/virtualbricks.template.glade:9863 msgid "Use FSTP" msgstr "" #: share/virtualbricks.template.glade:9875 msgid "Hub mode" msgstr "" #: share/virtualbricks.template.glade:9897 msgid "Switch Configuration" msgstr "" #: share/virtualbricks.template.glade:9947 msgid "" " \n" "\n" msgstr "" #: share/virtualbricks.template.glade:9978 msgid "Don't touch interface settings" msgstr "" #: share/virtualbricks.template.glade:9988 msgid "Use DHCP" msgstr "" #: share/virtualbricks.template.glade:10003 msgid "Manual settings" msgstr "" #: share/virtualbricks.template.glade:10033 msgid "IP Address: " msgstr "" #: share/virtualbricks.template.glade:10040 msgid "Netmask: " msgstr "" #: share/virtualbricks.template.glade:10051 msgid "Gateway: " msgstr "" #: share/virtualbricks.template.glade:10065 msgid "10.0.0.1" msgstr "" #: share/virtualbricks.template.glade:10080 msgid "255.0.0.0" msgstr "" #: share/virtualbricks.template.glade:10121 msgid "Tap Configuration" msgstr "" #: share/virtualbricks.template.glade:10214 #: share/virtualbricks.template.glade:14239 msgid "Delay:" msgstr "" #: share/virtualbricks.template.glade:10246 virtualbricks/brickfactory.py:888 msgid "Actions" msgstr "" #: share/virtualbricks.template.glade:10285 msgid "Event Configuration" msgstr "" #: share/virtualbricks.template.glade:10320 #: share/virtualbricks.template.glade:10435 msgid "Connect to" msgstr "" #: share/virtualbricks.template.glade:10352 msgid "Listen to port:" msgstr "" #: share/virtualbricks.template.glade:10362 msgid "Expect password:" msgstr "" #: share/virtualbricks.template.glade:10401 msgid "Tunnel server Configuration" msgstr "" #: share/virtualbricks.template.glade:10455 #: share/virtualbricks.template.glade:12795 msgid "port:" msgstr "" #: share/virtualbricks.template.glade:10485 #: share/virtualbricks.template.glade:13817 msgid "Tunnel Server" msgstr "" #: share/virtualbricks.template.glade:10510 msgid "Password:" msgstr "" #: share/virtualbricks.template.glade:10521 msgid "Local port:" msgstr "" #: share/virtualbricks.template.glade:10564 msgid "Tunnel client Configuration" msgstr "" #: share/virtualbricks.template.glade:10603 msgid "WAIT..." msgstr "" #: share/virtualbricks.template.glade:10708 msgid "Virtualbricks Settings" msgstr "" #: share/virtualbricks.template.glade:10721 msgid "System Settings" msgstr "" #: share/virtualbricks.template.glade:10756 msgid "Bricks directory" msgstr "" #: share/virtualbricks.template.glade:10764 #: share/virtualbricks.template.glade:10900 #: share/virtualbricks.template.glade:11049 #: share/virtualbricks.template.glade:11133 msgid "Select A Folder" msgstr "" #: share/virtualbricks.template.glade:10775 msgid "X-window terminal command" msgstr "" #: share/virtualbricks.template.glade:10786 msgid "X-window sudo command" msgstr "" #: share/virtualbricks.template.glade:10797 msgid "your favorite x-terminal-emulator" msgstr "" #: share/virtualbricks.template.glade:10811 msgid "command to perform administrative actions on your system" msgstr "" #: share/virtualbricks.template.glade:10835 msgid "Enable SysTray" msgstr "" #: share/virtualbricks.template.glade:10856 msgid "General" msgstr "" #: share/virtualbricks.template.glade:10892 msgid "VDE binaries path" msgstr "" #: share/virtualbricks.template.glade:10898 msgid "Path for vde components installed on the system" msgstr "" #: share/virtualbricks.template.glade:10913 #: share/virtualbricks.template.glade:11062 msgid "Status:" msgstr "" #: share/virtualbricks.template.glade:10929 msgid "" "Error:\n" "invalid path for vde binaries" msgstr "" #: share/virtualbricks.template.glade:10956 msgid "Use python support" msgstr "" #: share/virtualbricks.template.glade:10960 msgid "Use native python support from libvdeplug" msgstr "" #: share/virtualbricks.template.glade:10969 msgid "Allow female plugs on devices" msgstr "" #: share/virtualbricks.template.glade:10973 msgid "Allow use of female plugs with all brick types" msgstr "" #: share/virtualbricks.template.glade:10982 msgid "Network topology loop detection" msgstr "" #: share/virtualbricks.template.glade:10986 msgid "" "If enabled, detect network loops when starting the bricks, and generate an " "error." msgstr "" #: share/virtualbricks.template.glade:11000 msgid "Vde" msgstr "" #: share/virtualbricks.template.glade:11041 msgid "Qemu/KVM binaries path" msgstr "" #: share/virtualbricks.template.glade:11047 msgid "Path for qemu and kvm binaries" msgstr "" #: share/virtualbricks.template.glade:11078 msgid "" "Error:\n" "invalid path for qemu/kvm binaries" msgstr "" #: share/virtualbricks.template.glade:11125 msgid "Disk images repository" msgstr "" #: share/virtualbricks.template.glade:11131 msgid "Directory that contains hard disk images" msgstr "" #: share/virtualbricks.template.glade:11149 msgid "Disk Images" msgstr "" #: share/virtualbricks.template.glade:11177 msgid "Use KVM" msgstr "" #: share/virtualbricks.template.glade:11181 msgid "Allow the use of kernel-based virtual machine (recommended)" msgstr "" #: share/virtualbricks.template.glade:11191 msgid "Enable KSM" msgstr "" #: share/virtualbricks.template.glade:11195 msgid "Allow using the Kernel SamePage Merging support to enhance scalability" msgstr "" #: share/virtualbricks.template.glade:11210 msgid "Use kqemu" msgstr "" #: share/virtualbricks.template.glade:11214 msgid "Use old kqemu support" msgstr "" #: share/virtualbricks.template.glade:11228 msgid "X86 optimizations" msgstr "" #: share/virtualbricks.template.glade:11245 msgid "CD-Rom/DVD/Floppy Devices" msgstr "" #: share/virtualbricks.template.glade:11265 msgid "" "Add your \"real\" physical drive volumes like CDR, DVD or Floppy devices " "here." msgstr "" #: share/virtualbricks.template.glade:11282 msgid "Name: " msgstr "" #: share/virtualbricks.template.glade:11303 msgid "Device Path: " msgstr "" #: share/virtualbricks.template.glade:11323 msgid "Add" msgstr "" #: share/virtualbricks.template.glade:11367 msgid "Qemu/KVM " msgstr "" #: share/virtualbricks.template.glade:11454 msgid "Add Bookmark" msgstr "" #: share/virtualbricks.template.glade:11468 msgid "Name:" msgstr "" #: share/virtualbricks.template.glade:11493 msgid "Path:" msgstr "" #: share/virtualbricks.template.glade:11522 msgid "Select A Icon" msgstr "" #: share/virtualbricks.template.glade:11532 msgid "Icon for this Machine" msgstr "" #: share/virtualbricks.template.glade:11612 #: share/virtualbricks.template.glade:12101 msgid "show qemu volume info for selected image" msgstr "" #: share/virtualbricks.template.glade:11627 msgid "remove this entry from My Machines" msgstr "" #: share/virtualbricks.template.glade:11637 msgid "About: Virtualbricks" msgstr "" #: share/virtualbricks.template.glade:11693 msgid "" "Virtualbricks is a GNU/Linux desktop gui for Qemu/KVM and Virtual " "Distributed Ethernet.\n" "\n" "Virtualbricks is licensed under the terms of the GPL (General Public " "Licence) Version 2.\n" "© 2011 Daniele Lacamera, Rainer Haage and the virtualbricks team on " "Launchpad. \n" "\n" "VDE - Virtual Distributed Ethernet - © 2003-2011 Renzo Davoli.\n" "QEMU - Copyright © 2005-2011 Fabrice Bellard.\n" "QEMU is a trademark of Fabrice Bellard.\n" "\n" "Icons for remote hosts are Copyleft David Vignoni - http://www.icon-king." "com/ License: LGPL\n" "\n" "If you find virtualbricks useful for your business, please consider making a " "donation." msgstr "" #: share/virtualbricks.template.glade:11750 msgid "create new empty image" msgstr "" #: share/virtualbricks.template.glade:11767 msgid "create new empty Disk image\n" msgstr "" #: share/virtualbricks.template.glade:11780 msgid "Target Folder for the new image" msgstr "" #: share/virtualbricks.template.glade:11790 msgid "Select A Directory" msgstr "" #: share/virtualbricks.template.glade:11813 msgid "Name of the new image (or base image)" msgstr "" #: share/virtualbricks.template.glade:11828 msgid "Enter a filename for the new image" msgstr "" #: share/virtualbricks.template.glade:11859 msgid "Image format" msgstr "" #: share/virtualbricks.template.glade:11870 msgid "" "Auto\n" "raw\n" "qcow\n" "qcow2\n" "cow\n" "vmdk\n" "cloop" msgstr "" #: share/virtualbricks.template.glade:11897 msgid "Size" msgstr "" #: share/virtualbricks.template.glade:11912 msgid "Size of the new image" msgstr "" #: share/virtualbricks.template.glade:11926 msgid "" "KB\n" "MB\n" "GB" msgstr "" #: share/virtualbricks.template.glade:11986 msgid "Create" msgstr "" #: share/virtualbricks.template.glade:12036 msgid "message" msgstr "" #: share/virtualbricks.template.glade:12111 msgid "add this image to bookmarks" msgstr "" #: share/virtualbricks.template.glade:12121 msgid "Control monitor" msgstr "" #: share/virtualbricks.template.glade:12136 msgid "control monitor for selected qemu job" msgstr "" #: share/virtualbricks.template.glade:12152 msgid "kill emulation immediately" msgstr "" #: share/virtualbricks.template.glade:12165 msgid "reset emulation" msgstr "" #: share/virtualbricks.template.glade:12186 msgid "pause emulation" msgstr "" #: share/virtualbricks.template.glade:12199 msgid "resume emulation" msgstr "" #: share/virtualbricks.template.glade:12227 msgid "Available block devices" msgstr "" #: share/virtualbricks.template.glade:12245 msgid "" "This is a list of all blockdevices used by the emulation. Rightclick an " "entry to eject. (hd volumes normally can not be ejected)" msgstr "" #: share/virtualbricks.template.glade:12259 msgid "change soure of block devices" msgstr "" #: share/virtualbricks.template.glade:12275 #: share/virtualbricks.template.glade:12290 #: share/virtualbricks.template.glade:12307 msgid "Change" msgstr "" #: share/virtualbricks.template.glade:12279 msgid "change the source for qemu cdrom device to the selected image or drive" msgstr "" #: share/virtualbricks.template.glade:12294 msgid "" "change the source for qemu floppy A device to the selected image or drive" msgstr "" #: share/virtualbricks.template.glade:12311 msgid "" "change the source for qemu floppy B device to the selected image or drive" msgstr "" #: share/virtualbricks.template.glade:12326 msgid "cdrom" msgstr "" #: share/virtualbricks.template.glade:12369 #: share/virtualbricks.template.glade:12382 #: share/virtualbricks.template.glade:12398 msgid "None" msgstr "" #: share/virtualbricks.template.glade:12434 msgid "Available host usb devices" msgstr "" #: share/virtualbricks.template.glade:12452 msgid "" "All available host usb-devices. rightclick to attach a device to the virtual " "engine (you must have write access to /proc/bus/usb to attach devices)" msgstr "" #: share/virtualbricks.template.glade:12466 msgid "Attached guest usb devices" msgstr "" #: share/virtualbricks.template.glade:12484 msgid "" "All attached usb devices for this emulation. Rightclick to detach a device" msgstr "" #: share/virtualbricks.template.glade:12503 msgid "USB" msgstr "" #: share/virtualbricks.template.glade:12515 msgid "coming soon..." msgstr "" #: share/virtualbricks.template.glade:12525 msgid "Emulation" msgstr "" #: share/virtualbricks.template.glade:12577 msgid "open control monitor" msgstr "" #: share/virtualbricks.template.glade:12614 msgid "Suspend Qemu" msgstr "" #: share/virtualbricks.template.glade:12623 msgid "Send ACPI poweroff" msgstr "" #: share/virtualbricks.template.glade:12632 msgid "Send ACPI hard reset" msgstr "" #: share/virtualbricks.template.glade:12688 msgid "eject / unmount selected device" msgstr "" #: share/virtualbricks.template.glade:12696 msgid "Setup new network card" msgstr "" #: share/virtualbricks.template.glade:12709 msgid "Network Type" msgstr "" #: share/virtualbricks.template.glade:12721 msgid "" "Open a TUN/TAP interface\n" "Use an already open TUN/TAP interface\n" "Open a listening TCP socket\n" "Use an already open TCP socket\n" "Connect to listening TCP socket\n" "Create shared VLAN via UDP multicast socket\n" "Use an already open UDP multicast socket" msgstr "" #: share/virtualbricks.template.glade:12756 msgid "IP address: " msgstr "" #: share/virtualbricks.template.glade:12767 msgid "MAC address: " msgstr "" #: share/virtualbricks.template.glade:12808 msgid "VLAN:" msgstr "" #: share/virtualbricks.template.glade:12889 msgid "TUN/TAP configuration script:" msgstr "" #: share/virtualbricks.template.glade:12900 msgid "Name of network interface:" msgstr "" #: share/virtualbricks.template.glade:12984 msgid "File descriptor: " msgstr "" #: share/virtualbricks.template.glade:13063 msgid "Request" msgstr "" #: share/virtualbricks.template.glade:13091 #: share/virtualbricks.template.glade:14419 msgid "Are you sure?" msgstr "" #: share/virtualbricks.template.glade:13150 msgid "Add redirect" msgstr "" #: share/virtualbricks.template.glade:13175 msgid "TCP" msgstr "" #: share/virtualbricks.template.glade:13191 msgid "UDP" msgstr "" #: share/virtualbricks.template.glade:13214 #: share/virtualbricks.template.glade:13262 msgid "port " msgstr "" #: share/virtualbricks.template.glade:13239 msgid "to guest IP " msgstr "" #: share/virtualbricks.template.glade:13291 msgid "Add redirect(s)" msgstr "" #: share/virtualbricks.template.glade:13361 msgid "Mode:" msgstr "" #: share/virtualbricks.template.glade:13373 msgid "DHCP" msgstr "" #: share/virtualbricks.template.glade:13386 msgid "Manual" msgstr "" #: share/virtualbricks.template.glade:13424 msgid "Address:" msgstr "" #: share/virtualbricks.template.glade:13430 msgid "Netmask:" msgstr "" #: share/virtualbricks.template.glade:13474 msgid "Advanced" msgstr "" #: share/virtualbricks.template.glade:13495 #: share/virtualbricks.template.glade:13924 #: share/virtualbricks.template.glade:14279 msgid "Cancel" msgstr "" #: share/virtualbricks.template.glade:13508 #: share/virtualbricks.template.glade:13939 #: share/virtualbricks.template.glade:14294 msgid "Ok" msgstr "" #: share/virtualbricks.template.glade:13574 msgid "Switch" msgstr "" #: share/virtualbricks.template.glade:13613 msgid "Wire" msgstr "" #: share/virtualbricks.template.glade:13652 msgid "Wirefilter" msgstr "" #: share/virtualbricks.template.glade:13691 msgid "Tap" msgstr "" #: share/virtualbricks.template.glade:13739 msgid "Tunnel Client" msgstr "" #: share/virtualbricks.template.glade:13778 msgid "Virtual Machine" msgstr "" #: share/virtualbricks.template.glade:13842 msgid "Run on remote host:" msgstr "" #: share/virtualbricks.template.glade:13890 msgid "Brick name:" msgstr "" #: share/virtualbricks.template.glade:13968 msgid "Event type selection" msgstr "" #: share/virtualbricks.template.glade:14015 msgid "Brick Start" msgstr "" #: share/virtualbricks.template.glade:14053 msgid "Brick Stop" msgstr "" #: share/virtualbricks.template.glade:14092 msgid "Brick Config" msgstr "" #: share/virtualbricks.template.glade:14130 msgid "" "Free\n" "Shell Command" msgstr "" #: share/virtualbricks.template.glade:14178 msgid "Events Collation" msgstr "" #: share/virtualbricks.template.glade:14221 msgid "Event name:" msgstr "" #: share/virtualbricks.template.glade:14251 msgid "10" msgstr "" #: share/virtualbricks.template.glade:14327 #: share/virtualbricks.template.glade:14782 msgid " " msgstr "" #: share/virtualbricks.template.glade:14338 #: share/virtualbricks.template.glade:14793 msgid "_Start/Stop" msgstr "" #: share/virtualbricks.template.glade:14346 #: share/virtualbricks.template.glade:14801 msgid "_Delete" msgstr "" #: share/virtualbricks.template.glade:14354 #: share/virtualbricks.template.glade:14809 msgid "Make a C_opy" msgstr "" #: share/virtualbricks.template.glade:14362 #: share/virtualbricks.template.glade:14817 msgid "Re_name" msgstr "" #: share/virtualbricks.template.glade:14370 #: share/virtualbricks.template.glade:14825 msgid "_Configure" msgstr "" #: share/virtualbricks.template.glade:14379 msgid "_Resume VM" msgstr "" #: share/virtualbricks.template.glade:14387 msgid "_Attach Event" msgstr "" #: share/virtualbricks.template.glade:14427 msgid "Confirm Action" msgstr "" #: share/virtualbricks.template.glade:14502 #: share/virtualbricks.template.glade:14850 msgid "Choose a new name:" msgstr "" #: share/virtualbricks.template.glade:14569 msgid "Virtualbricks: action in progress" msgstr "" #: share/virtualbricks.template.glade:14584 msgid "Please wait" msgstr "" #: share/virtualbricks.template.glade:14613 msgid "Select Image file" msgstr "" #: share/virtualbricks.template.glade:14674 msgid "Toggle window" msgstr "" #: share/virtualbricks.template.glade:14687 msgid "Close VB" msgstr "" #: share/virtualbricks.template.glade:14695 msgid "Shell command actions" msgstr "" #: share/virtualbricks.template.glade:14712 msgid "" "Enter shell command:\n" "(each line is an action)" msgstr "" #: share/virtualbricks.template.glade:14833 msgid "New event name" msgstr "" #: share/virtualbricks.template.glade:14918 msgid "Bricks to add to the event" msgstr "" #: share/virtualbricks.template.glade:14954 msgid "Bricks available" msgstr "" #: share/virtualbricks.template.glade:14979 msgid "" "--->\n" "<---" msgstr "" #: share/virtualbricks.template.glade:15050 msgid "Bricks added" msgstr "" #: share/virtualbricks.template.glade:15114 msgid "Messages" msgstr "" #: share/virtualbricks.template.glade:15240 msgid "Start Event selection" msgstr "" #: share/virtualbricks.template.glade:15254 #: share/virtualbricks.template.glade:15319 msgid "Assign Nothing" msgstr "" #: share/virtualbricks.template.glade:15305 msgid "Stop Event selection" msgstr "" #: share/virtualbricks.template.glade:15391 msgid "Connect/Disconnect" msgstr "" #: share/virtualbricks.template.glade:15399 msgid "Change Password" msgstr "" #: share/virtualbricks.template.glade:15407 msgid "Auto-connect at startup" msgstr "" #: share/virtualbricks.template.glade:15415 msgid "Delete" msgstr "" #: share/virtualbricks.template.glade:15421 msgid "Authentication" msgstr "" #: share/virtualbricks.template.glade:15434 msgid "Password for remote virtualbricks session:" msgstr "" #: virtualbricks/brickfactory.py:584 #, python-format msgid "Starting: '%s'" msgstr "" #: virtualbricks/brickfactory.py:623 #, python-format msgid "Shutting down %s" msgstr "" #: virtualbricks/brickfactory.py:638 #, python-format msgid "can not send SIGTERM: '%s'" msgstr "" #: virtualbricks/brickfactory.py:641 msgid "can not stop brick error code:" msgstr "" #: virtualbricks/brickfactory.py:709 msgid "Error: cannot start a terminal emulator" msgstr "" #: virtualbricks/brickfactory.py:714 msgid "Error running command line" msgstr "" #: virtualbricks/brickfactory.py:721 msgid "does not have a console" msgstr "" #: virtualbricks/brickfactory.py:732 msgid "error opening internal console" msgstr "" #: virtualbricks/brickfactory.py:777 virtualbricks/brickfactory.py:834 msgid "running" msgstr "" #: virtualbricks/brickfactory.py:779 virtualbricks/brickfactory.py:1082 #: virtualbricks/brickfactory.py:1144 virtualbricks/brickfactory.py:1149 #: virtualbricks/brickfactory.py:1151 virtualbricks/brickfactory.py:1888 #: virtualbricks/brickfactory.py:1940 msgid "disconnected" msgstr "" #: virtualbricks/brickfactory.py:781 virtualbricks/brickfactory.py:838 msgid "off" msgstr "" #: virtualbricks/brickfactory.py:836 msgid "unconfigured" msgstr "" #: virtualbricks/brickfactory.py:861 msgid "Error: config line must contain add OR addsh." msgstr "" #: virtualbricks/brickfactory.py:869 #, python-format msgid "Added vb-shell command: '%s'" msgstr "" #: virtualbricks/brickfactory.py:876 #, python-format msgid "Added host-shell command: '%s'" msgstr "" #: virtualbricks/brickfactory.py:1019 msgid "Ports:" msgstr "" #: virtualbricks/brickfactory.py:1080 #, python-format msgid "plugged to %s " msgstr "" #: virtualbricks/brickfactory.py:1152 msgid "Configured to connect" msgstr "" #: virtualbricks/brickfactory.py:1154 msgid "Not yet configured." msgstr "" #: virtualbricks/brickfactory.py:1155 msgid "Left plug is" msgstr "" #: virtualbricks/brickfactory.py:1155 msgid "and right plug is" msgstr "" #: virtualbricks/brickfactory.py:1886 virtualbricks/brickfactory.py:1937 msgid "plugged to" msgstr "" #: virtualbricks/brickfactory.py:1887 msgid "listening to udp:" msgstr "" #: virtualbricks/brickfactory.py:1938 msgid ", connecting to udp://" msgstr "" #: virtualbricks/brickfactory.py:2209 msgid "command:" msgstr "" #: virtualbricks/brickfactory.py:2857 msgid "Engine: Bye!" msgstr "" #: virtualbricks/gui/gui.py:107 msgid "PID" msgstr "" #: virtualbricks/gui/gui.py:107 virtualbricks/gui/gui.py:109 #: virtualbricks/gui/gui.py:199 virtualbricks/gui/gui.py:221 #: virtualbricks/gui/gui.py:1140 virtualbricks/gui/gui.py:1162 #: virtualbricks/gui/gui.py:2739 virtualbricks/gui/gui.py:2761 msgid "Type" msgstr "" #: virtualbricks/gui/gui.py:107 virtualbricks/gui/gui.py:109 #: virtualbricks/gui/gui.py:204 virtualbricks/gui/gui.py:223 #: virtualbricks/gui/gui.py:1142 virtualbricks/gui/gui.py:1164 #: virtualbricks/gui/gui.py:2741 virtualbricks/gui/gui.py:2763 msgid "Name" msgstr "" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:119 #: virtualbricks/gui/gui.py:132 virtualbricks/gui/gui.py:181 #: virtualbricks/gui/gui.py:214 virtualbricks/gui/gui.py:1138 #: virtualbricks/gui/gui.py:1160 virtualbricks/gui/gui.py:2737 #: virtualbricks/gui/gui.py:2759 msgid "Icon" msgstr "" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:197 #: virtualbricks/gui/gui.py:219 msgid "Status" msgstr "" #: virtualbricks/gui/gui.py:109 virtualbricks/gui/gui.py:206 #: virtualbricks/gui/gui.py:225 virtualbricks/gui/gui.py:1144 #: virtualbricks/gui/gui.py:1166 virtualbricks/gui/gui.py:2743 #: virtualbricks/gui/gui.py:2765 msgid "Parameters" msgstr "" #: virtualbricks/gui/gui.py:115 msgid "Address" msgstr "" #: virtualbricks/gui/gui.py:115 msgid "Autoconnect" msgstr "" #: virtualbricks/gui/gui.py:332 virtualbricks/gui/gui.py:1093 msgid "Command" msgstr "" #: virtualbricks/gui/gui.py:336 virtualbricks/gui/gui.py:1097 msgid "Host shell command" msgstr "" #: virtualbricks/gui/gui.py:443 msgid "KVM is disabled from Properties" msgstr "" #: virtualbricks/gui/gui.py:729 msgid "Show Settings" msgstr "" #: virtualbricks/gui/gui.py:755 virtualbricks/gui/gui.py:792 msgid "Hide Settings" msgstr "" #: virtualbricks/gui/gui.py:1040 virtualbricks/gui/gui.py:1047 msgid "Cannot create brick: Invalid name." msgstr "" #: virtualbricks/gui/gui.py:1064 virtualbricks/gui/gui.py:1068 msgid "The name \"" msgstr "" #: virtualbricks/gui/gui.py:1064 msgid "\" has forbidden format." msgstr "" #: virtualbricks/gui/gui.py:1068 msgid "\" has been adapted to \"" msgstr "" #: virtualbricks/gui/gui.py:1072 msgid "An event named \"" msgstr "" #: virtualbricks/gui/gui.py:1072 msgid "\" already exist." msgstr "" #: virtualbricks/gui/gui.py:1176 msgid "Bricks to add to the event to be started" msgstr "" #: virtualbricks/gui/gui.py:1180 msgid "Bricks to add to the event to be stopped" msgstr "" #: virtualbricks/gui/gui.py:1184 msgid "Events to add to the event to be started" msgstr "" #: virtualbricks/gui/gui.py:1189 msgid "Cannot create event: Invalid name." msgstr "" #: virtualbricks/gui/gui.py:1313 msgid "Help for parameter:" msgstr "" #: virtualbricks/gui/gui.py:1318 #, python-format msgid "" "\n" "Jitter is the variation from the base value. Jitter 10 percent for a base " "value of 100 means the final value goes from 90 to 110. The distribution can " "be Uniform or Gaussian normal (more than 98% of the values are inside the " "limits)." msgstr "" #: virtualbricks/gui/gui.py:1326 msgid "" "\t\t\tCHANNEL BANDWIDTH\n" "\n" "Sender is not prevented from sending packets, delivery is delayed to limit " "the bandwidth to the desired value (like a bottleneck along the path)." msgstr "" #: virtualbricks/gui/gui.py:1333 msgid "" "\t\t\tINTERFACE SPEED\n" "\n" "Input is blocked for the tramission time of the packet, thus the sender is " "prevented from sending too fast.\n" "This feature can be confusing, consider using bandwidth." msgstr "" #: virtualbricks/gui/gui.py:1340 msgid "" "\t\t\tDELAY\n" "\n" "Extra delay (in milliseconds). This delay is added to the real communication " "delay. Packets are temporarily stored and resent after the delay." msgstr "" #: virtualbricks/gui/gui.py:1347 msgid "" "\t\t\tCHANNEL BUFFER SIZE\n" "\n" "Maximum size of the packet queue. Exceeding packets are discarded." msgstr "" #: virtualbricks/gui/gui.py:1353 msgid "" "\t\t\tPACKET LOSS\n" "\n" "Percentage of loss as a floating point number." msgstr "" #: virtualbricks/gui/gui.py:1358 msgid "" "\t\t\tPACKET DUPLICATION\n" "\n" "Percentage of dup packet. Do not use dup factor 100% because it means that " "each packet is sent infinite times." msgstr "" #: virtualbricks/gui/gui.py:1364 msgid "" "\t\t\tNOISE\n" "\n" "Number of bits damaged/one megabyte (megabit)." msgstr "" #: virtualbricks/gui/gui.py:1369 msgid "" "\t\t\tLOST BURST\n" "\n" "When this is not zero, wirefilter uses the Gilbert model for bursty errors. " "This is the mean length of lost packet bursts." msgstr "" #: virtualbricks/gui/gui.py:1375 msgid "" "\t\t\tMTU: MAXIMUM TRANSMISSION UNIT\n" "\n" "Packets longer than specified size are discarded." msgstr "" #: virtualbricks/gui/gui.py:1599 #, python-format msgid "Cannot start '%s': not configured" msgstr "" #: virtualbricks/gui/gui.py:1604 #, python-format msgid "Cannot start '%s': not connected" msgstr "" #: virtualbricks/gui/gui.py:1610 msgid "" "Loop link detected: aborting operation. If you want to start a looped " "network, disable the check loop feature in the general settings" msgstr "" #: virtualbricks/gui/gui.py:1618 msgid "Disk used by the VM is locked by another machine" msgstr "" #: virtualbricks/gui/gui.py:1892 msgid "Choose a filename first!" msgstr "" #: virtualbricks/gui/gui.py:2081 msgid "No KVM binary found" msgstr "" #: virtualbricks/gui/gui.py:2081 virtualbricks/gui/gui.py:2084 msgid "Check your active configuration" msgstr "" #: virtualbricks/gui/gui.py:2081 virtualbricks/gui/gui.py:2084 msgid "KVM will stay disabled" msgstr "" #: virtualbricks/gui/gui.py:2084 msgid "No KVM support found on the system" msgstr "" #: virtualbricks/gui/gui.py:2092 msgid "No KSM support found on the system" msgstr "" #: virtualbricks/gui/gui.py:2092 msgid "Check your configuration" msgstr "" #: virtualbricks/gui/gui.py:2092 msgid "KSM will stay disabled" msgstr "" #: virtualbricks/gui/gui.py:2106 msgid "The brick is still running, it will be killed before being deleted!\n" msgstr "" #: virtualbricks/gui/gui.py:2108 msgid "Do you really want to delete " msgstr "" #: virtualbricks/gui/gui.py:2117 msgid "This event is in use" msgstr "" #: virtualbricks/gui/gui.py:2119 msgid "Do you really want to delete" msgstr "" #: virtualbricks/gui/gui.py:2129 msgid "Cannot rename Brick: it is in use." msgstr "" #: virtualbricks/gui/gui.py:2155 virtualbricks/gui/gui.py:2167 #: virtualbricks/gui/gui.py:2226 msgid "Invalid name!" msgstr "" #: virtualbricks/gui/gui.py:2161 msgid "Cannot rename Event: it is in use." msgstr "" #: virtualbricks/gui/gui.py:2272 virtualbricks/gui/gui.py:2281 #: virtualbricks/gui/gui.py:2311 msgid "Error" msgstr "" #: virtualbricks/gui/gui.py:2272 msgid "invalid path for qemu binaries" msgstr "" #: virtualbricks/gui/gui.py:2281 msgid "cannot find neither qemu nor kvm in this path" msgstr "" #: virtualbricks/gui/gui.py:2285 virtualbricks/gui/gui.py:2288 msgid "Warning" msgstr "" #: virtualbricks/gui/gui.py:2285 msgid "cannot find qemu, using kvm only\n" msgstr "" #: virtualbricks/gui/gui.py:2288 msgid "kvm not found" msgstr "" #: virtualbricks/gui/gui.py:2288 msgid "KVM support disabled" msgstr "" #: virtualbricks/gui/gui.py:2290 msgid "KVM and Qemu detected" msgstr "" #: virtualbricks/gui/gui.py:2302 msgid "additional targets supported" msgstr "" #: virtualbricks/gui/gui.py:2311 msgid "invalid path for vde binaries" msgstr "" #: virtualbricks/gui/gui.py:2313 msgid "Warning, missing modules" msgstr "" #: virtualbricks/gui/gui.py:2318 msgid "All VDE components detected" msgstr "" #: virtualbricks/gui/gui.py:2384 msgid "" "No KVM binary found. Check your active configuration. KVM will stay disabled." msgstr "" #: virtualbricks/gui/gui.py:2387 msgid "" "No KVM support found on the system. Check your active configuration. KVM " "will stay disabled." msgstr "" #: virtualbricks/gui/gui.py:2558 msgid "Suspend/Resume not supported on this disk." msgstr "" #: virtualbricks/gui/gui.py:2583 msgid "Cannot find suspend point." msgstr "" #: virtualbricks/gui/gui.py:2615 msgid "Error saving topology: Invalid image format" msgstr "" #: virtualbricks/gui/gui.py:2617 msgid "Error saving topology: Could not write file" msgstr "" #: virtualbricks/gui/gui.py:2619 msgid "Error saving topology: Unknown error" msgstr "" #: virtualbricks/gui/gui.py:2774 msgid "Virtualbricks-Events to attach to the start/stop Brick Events" msgstr "" #: virtualbricks/gui/gui.py:2780 msgid "Save current project?" msgstr "" #: virtualbricks/gui/gui.py:2783 msgid "Open a project" msgstr "" #: virtualbricks/gui/gui.py:2786 virtualbricks/gui/gui.py:2806 #: virtualbricks/gui/gui.py:2836 msgid "Virtualbricks Bricks List" msgstr "" #: virtualbricks/gui/gui.py:2790 virtualbricks/gui/gui.py:2810 #: virtualbricks/gui/gui.py:2840 msgid "All files" msgstr "" #: virtualbricks/gui/gui.py:2802 msgid "Save as..." msgstr "" #: virtualbricks/gui/gui.py:2832 msgid "New project" msgstr "" #: virtualbricks/settings.py:86 #, python-format msgid "Configuration loaded ('%s')" msgstr "" #: virtualbricks/settings.py:88 msgid "Cannot read config file " msgstr "" #: virtualbricks/settings.py:90 msgid "Default configuration loaded" msgstr "" #: virtualbricks/settings.py:94 #, python-format msgid "Default configuration saved ('%s')" msgstr "" #: virtualbricks/settings.py:97 msgid "Cannot save default configuration" msgstr "" virtualbricks-1.0.2/setup.py000077500000000000000000000057731262207653100161330ustar00rootroot00000000000000#!/usr/bin/env python # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os.path import tempfile import shutil import glob from distutils.command import install_data from distutils.core import setup from virtualbricks import version class InstallData(install_data.install_data): def initialize_options(self): install_data.install_data.initialize_options(self) self.tmpdirs = [] def compile_mo(self): for filename in glob.iglob("locale/virtualbricks/??.po"): l, _ = os.path.basename(filename).split(".") tmpdir = tempfile.mkdtemp() self.tmpdirs.append(tmpdir) outfile = "%s/virtualbricks.mo" % tmpdir self.spawn(["msgfmt", "-o", outfile, filename]) self.data_files.append(("share/locale/%s/LC_MESSAGES" % l, [outfile])) def remove_temps(self): for tmpdir in self.tmpdirs: shutil.rmtree(tmpdir) def run(self): self.execute(self.compile_mo, ()) install_data.install_data.run(self) self.execute(self.remove_temps, ()) data_images = glob.glob("virtualbricks/gui/data/*.png") data_helps = glob.glob("virtualbricks/gui/data/help/*") data_glade_ui = glob.glob("virtualbricks/gui/data/*.ui") setup(name="virtualbricks", version=version.short(), description="Virtualbricks Virtualization Tools", author="Daniele Lacamera, Rainer Haage, Francesco Apollonio, " "Pierre-Louis Bonicoli, Simone Abbati", author_email="qemulator-list@createweb.de", url="http://www.virtualbricks.eu/", license="GPLv2", platforms=["linux2", "linux"], packages=["virtualbricks", "virtualbricks.gui", "virtualbricks.scripts", "virtualbricks.tests"], package_data={"virtualbricks.tests": ["data/*"]}, data_files=[("share/applications", ["share/virtualbricks.desktop"]), ("share/pixmaps", ["share/virtualbricks.xpm"]), ("share/virtualbricks", data_images + data_glade_ui + data_helps), ], scripts=["bin/virtualbricks"], requires=["twisted (>=12.0.0)", "zope.interface (>=3.5)"], cmdclass={"install_data": InstallData} ) virtualbricks-1.0.2/share/000077500000000000000000000000001262207653100155045ustar00rootroot00000000000000virtualbricks-1.0.2/share/virtualbricks.desktop000066400000000000000000000003361262207653100217650ustar00rootroot00000000000000[Desktop Entry] Version=1.0.2 Name=Virtualbricks Comment=Manage your virtual network and virtual machines Exec=virtualbricks Icon=virtualbricks Terminal=true Type=Application Categories=GNOME;Application;Emulator;Utility; virtualbricks-1.0.2/share/virtualbricks.desktop.~1~000066400000000000000000000003361262207653100225200ustar00rootroot00000000000000[Desktop Entry] Version=1.0.2 Name=Virtualbricks Comment=Manage your virtual network and virtual machines Exec=virtualbricks Icon=virtualbricks Terminal=true Type=Application Categories=GNOME;Application;Emulator;Utility; virtualbricks-1.0.2/share/virtualbricks.xpm000066400000000000000000000037031262207653100211210ustar00rootroot00000000000000/* XPM */ static char * vb_32x32_xpm[] = { "32 32 52 1", " c None", ". c #CB4343", "+ c #CA4343", "@ c #CB4444", "# c #CB4848", "$ c #CB4747", "% c #C1CCCC", "& c #C1CBCB", "* c #CA5252", "= c #C95A5A", "- c #C96060", "; c #CA5151", "> c #CA4A4A", ", c #C94D4D", "' c #C95959", ") c #C77373", "! c #C96363", "~ c #CA4C4C", "{ c #CA4545", "] c #CA4444", "^ c #CA4E4E", "/ c #CA5454", "( c #C95252", "_ c #CA5050", ": c #CA4D4D", "< c #CA5353", "[ c #CB4242", "} c #C95151", "| c #CA4F4F", "1 c #CA4747", "2 c #C95858", "3 c #CB4646", "4 c #CA4646", "5 c #CA4848", "6 c #C95656", "7 c #CB4545", "8 c #CA5555", "9 c #CA5656", "0 c #C95555", "a c #CA4B4B", "b c #C95F5F", "c c #CB4141", "d c #C95454", "e c #CB4040", "f c #CA5757", "g c #CA5959", "h c #C95B5B", "i c #C95C5C", "j c #CA5858", "k c #C86666", "l c #C96161", "m c #CA4949", " ", " ", " .+.....+. ", " .@@@@@@@@ ", " +@@@@@++ ", " @@@@@@+@ ", " .+....++ ", " ###$$### %& ", " ***=-;*; >,'))!=~ ", " {{]^/+{] ]].(_.{] ", " ...:<[.. ..[}|[.. ", " 11$;2311 4536/7]. ", " /88//88< .{_98/8; ", " [[[[[[[[ ]..[[[[. ", " ...[[... .[.....@ ", " ^|^*0^|^ |0^^|a] ", " ^|^2b:|: .]<-:^|~ ", " ..[~*c.. +.1/c... ", " [[c~de[[ [[#8e.]. ", " fgghiggf +7gghij< ", " {{{{{{{{ @.@{{{{{] ", " @....... .......]] ", " {{{44{{4 {{{{{{].. ", " 9jf-k9fl~[~fjjjf^ ", " [[ca*ee/>..[[[[[. ", " @+.:}. """ return cls._levelPriorities[constant] LogLevel._levelPriorities = dict((constant, idx) for (idx, constant) in (enumerate(LogLevel.iterconstants()))) # # Mappings to Python's logging module # pythonLogLevelMapping = { LogLevel.debug : logging.DEBUG, LogLevel.info : logging.INFO, LogLevel.warn : logging.WARNING, LogLevel.error : logging.ERROR, #LogLevel.critical: logging.CRITICAL, } ## # Loggers ## def formatEvent(event): """ Formats an event as a L{unicode}, using the format in C{event["log_format"]}. This implementation should never raise an exception; if the formatting cannot be done, the returned string will describe the event generically so that a useful message is emitted regardless. @param event: a logging event @return: a L{unicode} """ try: format = event.get("log_format", None) if format is None: raise ValueError("No log format provided") # Make sure format is unicode. if isinstance(format, bytes): # If we get bytes, assume it's UTF-8 bytes format = format.decode("utf-8") elif isinstance(format, unicode): pass else: raise TypeError("Log format must be unicode or bytes, not {0!r}" .format(format)) return formatWithCall(format, event) except BaseException as e: try: return formatUnformattableEvent(event, e) except: return u"MESSAGE LOST" def formatUnformattableEvent(event, error): """ Formats an event as a L{unicode} that describes the event generically and a formatting error. @param event: a logging event @param error: the formatting error @return: a L{unicode} """ try: return ( u"Unable to format event {event!r}: {error}" .format(event=event, error=error) ) except BaseException as error: # # Yikes, something really nasty happened. # # Try to recover as much formattable data as possible; # hopefully at least the namespace is sane, which will # help you find the offending logger. # try: items = [] for key, value in event.items(): try: items.append(u"{key!r} = ".format(key=key)) except: items.append(u" = ") try: items.append(u"{value!r}".format(value=value)) except: items.append(u"") text = ", ".join(items) except: text = "" return ( u"MESSAGE LOST: Unformattable object logged: {error}\n" u"Recoverable data: {text}" .format(text=text) ) class Logger(object): """ Logging object. """ publisher = lambda e: None @staticmethod def _namespaceFromCallingContext(): """ Derive a namespace from the module containing the caller's caller. @return: a namespace """ return inspect.currentframe().f_back.f_back.f_globals["__name__"] def __init__(self, namespace=None, source=None): """ @param namespace: The namespace for this logger. Uses a dotted notation, as used by python modules. If not C{None}, then the name of the module of the caller is used. @param source: The object which is emitting events to this logger; this is automatically set on instances of a class if this L{Logger} is an attribute of that class. """ if namespace is None: namespace = self._namespaceFromCallingContext() self.namespace = namespace self.source = source def __get__(self, oself, type=None): """ When used as a descriptor, i.e.:: # athing.py class Something(object): log = Logger() def hello(self): self.log.info("Hello") a L{Logger}'s namespace will be set to the name of the class it is declared on. In the above example, the namespace would be C{athing.Something}. Additionally, it's source will be set to the actual object referring to the L{Logger}. In the above example, C{Something.log.source} would be C{Something}, and C{Something().log.source} would be an instance of C{Something}. """ if oself is None: source = type else: source = oself return self.__class__( '.'.join([type.__module__, type.__name__]), source ) def __repr__(self): return "<%s %r>" % (self.__class__.__name__, self.namespace) def emit(self, level, format=None, **kwargs): """ Emit a log event to all log observers at the given level. @param level: a L{LogLevel} @param format: a message format using new-style (PEP 3101) formatting. The logging event (which is a L{dict}) is used to render this format string. @param kwargs: additional keyword parameters to include with the event. """ if level not in LogLevel.iterconstants(): # FIXME: Updated Twisted supports 'in' on constants container self.failure( "Got invalid log level {invalidLevel!r} in {logger}.emit().", Failure(InvalidLogLevelError(level)), invalidLevel = level, logger = self, ) #level = LogLevel.error # FIXME: continue to emit? return event = kwargs event.update( log_logger = self, log_level = level, log_namespace = self.namespace, log_source = self.source, log_format = format, log_time = time.time(), ) self.publisher(event) def failure(self, format, failure=None, level=LogLevel.error, **kwargs): """ Log an failure and emit a traceback. For example:: try: frob(knob) except Exception: log.failure("While frobbing {knob}", knob=knob) or:: d = deferred_frob(knob) d.addErrback(lambda f: log.failure, "While frobbing {knob}", f, knob=knob) @param format: a message format using new-style (PEP 3101) formatting. The logging event (which is a L{dict}) is used to render this format string. @param failure: a L{Failure} to log. If C{None}, a L{Failure} is created from the exception in flight. @param level: a L{LogLevel} to use. @param kwargs: additional keyword parameters to include with the event. """ if failure is None: failure=Failure() self.emit(level, format, log_failure=failure, **kwargs) class LegacyLogger(object): """ A logging object that provides some compatibility with the L{twisted.python.log} module. """ def __init__(self, logger=None): if logger is not None: self.newStyleLogger = logger else: self.newStyleLogger = Logger(Logger._namespaceFromCallingContext()) def __getattribute__(self, name): try: return super(LegacyLogger, self).__getattribute__(name) except AttributeError: return getattr(twisted.python.log, name) def msg(self, *message, **kwargs): """ This method is API-compatible with L{twisted.python.log.msg} and exists for compatibility with that API. """ if message: message = " ".join(map(safe_str, message)) else: message = None return self.newStyleLogger.emit(LogLevel.info, message, **kwargs) def err(self, _stuff=None, _why=None, **kwargs): """ This method is API-compatible with L{twisted.python.log.err} and exists for compatibility with that API. """ if _stuff is None: _stuff = Failure() elif isinstance(_stuff, Exception): _stuff = Failure(_stuff) if isinstance(_stuff, Failure): self.newStyleLogger.emit(LogLevel.error, failure=_stuff, why=_why, isError=1, **kwargs) else: # We got called with an invalid _stuff. self.newStyleLogger.emit(LogLevel.error, repr(_stuff), why=_why, isError=1, **kwargs) def bindEmit(level): doc = """ Emit a log event at log level L{{{level}}}. @param format: a message format using new-style (PEP 3101) formatting. The logging event (which is a L{{dict}}) is used to render this format string. @param kwargs: additional keyword parameters to include with the event. """.format(level=level.name) # # Attach methods to Logger # def log_emit(self, format=None, **kwargs): self.emit(level, format, **kwargs) log_emit.__doc__ = doc setattr(Logger, level.name, log_emit) for level in LogLevel.iterconstants(): bindEmit(level) del level # # Observers # class ILogObserver(Interface): """ An observer which can handle log events. """ def __call__(event): """ Log an event. @type event: C{dict} with (native) C{str} keys. @param event: A dictionary with arbitrary keys as defined by the application emitting logging events, as well as keys added by the logging system, with are: ... """ @implementer(ILogObserver) class LogPublisher(object): """ I{ILogObserver} that fans out events to other observers. Keeps track of a set of L{ILogObserver} objects and forwards events to each. """ log = Logger() def __init__(self, *observers): self._observers = set(observers) @property def observers(self): return frozenset(self._observers) def addObserver(self, observer): """ Registers an observer with this publisher. @param observer: An L{ILogObserver} to add. """ self._observers.add(observer) def removeObserver(self, observer): """ Unregisters an observer with this publisher. @param observer: An L{ILogObserver} to remove. """ try: self._observers.remove(observer) except KeyError: pass def __call__(self, event): for observer in self.observers: try: observer(event) except: # # We have to remove the offending observer because # we're going to badmouth it to all of its friends # (other observers) and it might get offended and # raise again, causing an infinite loop. # self.removeObserver(observer) try: self.log.failure("Observer {observer} raised an exception; removing.", observer=observer) except: pass finally: self.addObserver(observer) class PredicateResult(Names): """ Predicate results. """ yes = NamedConstant() # Log this no = NamedConstant() # Don't log this maybe = NamedConstant() # No opinion class ILogFilterPredicate(Interface): """ A predicate that determined whether an event should be logged. """ def __call__(event): """ Determine whether an event should be logged. @returns: a L{PredicateResult}. """ @implementer(ILogObserver) class FilteringLogObserver(object): """ L{ILogObserver} that wraps another L{ILogObserver}, but filters out events based on applying a series of L{ILogFilterPredicate}s. """ def __init__(self, observer, predicates): """ @param observer: an L{ILogObserver} to which this observer will forward events. @param predicates: an ordered iterable of predicates to apply to events before forwarding to the wrapped observer. """ self.observer = observer self.predicates = list(predicates) def shouldLogEvent(self, event): """ Determine whether an event should be logged, based C{self.predicates}. @param event: an event """ for predicate in self.predicates: result = predicate(event) if result == PredicateResult.yes: return True if result == PredicateResult.no: return False if result == PredicateResult.maybe: continue raise TypeError("Invalid predicate result: {0!r}".format(result)) return True def __call__(self, event): if self.shouldLogEvent(event): self.observer(event) @implementer(ILogFilterPredicate) class LogLevelFilterPredicate(object): """ L{ILogFilterPredicate} that filters out events with a log level lower than the log level for the event's namespace. """ def __init__(self): # FIXME: Make this a class variable. But that raises an # _initializeEnumerants constants error in Twisted 12.2.0. self.defaultLogLevel = LogLevel.info self._logLevelsByNamespace = {} self.clearLogLevels() def logLevelForNamespace(self, namespace): """ @param namespace: a logging namespace, or C{None} for the default namespace. @return: the L{LogLevel} for the specified namespace. """ if not namespace: return self._logLevelsByNamespace[None] if namespace in self._logLevelsByNamespace: return self._logLevelsByNamespace[namespace] segments = namespace.split(".") index = len(segments) - 1 while index > 0: namespace = ".".join(segments[:index]) if namespace in self._logLevelsByNamespace: return self._logLevelsByNamespace[namespace] index -= 1 return self._logLevelsByNamespace[None] def setLogLevelForNamespace(self, namespace, level): """ Sets the global log level for a logging namespace. @param namespace: a logging namespace @param level: the L{LogLevel} for the given namespace. """ if level not in LogLevel.iterconstants(): raise InvalidLogLevelError(level) if namespace: self._logLevelsByNamespace[namespace] = level else: self._logLevelsByNamespace[None] = level def clearLogLevels(self): """ Clears all global log levels to the default. """ self._logLevelsByNamespace.clear() self._logLevelsByNamespace[None] = self.defaultLogLevel def __call__(self, event): level = event["log_level"] namespace = event["log_namespace"] if (LogLevel._priorityForLevel(level) < LogLevel._priorityForLevel(self.logLevelForNamespace(namespace))): return PredicateResult.no return PredicateResult.maybe @implementer(ILogObserver) class LegacyLogObserver(object): """ L{ILogObserver} that wraps an L{ILegacyLogObserver}. """ def __init__(self, legacyObserver): """ @param legacyObserver: an L{ILegacyLogObserver} to which this observer will forward events. """ self.legacyObserver = legacyObserver def __call__(self, event): # if the event comes from the legacy machinery, do not send it back if "message" in event and "isError" in event: return prefix = "[{log_namespace}#{log_level.name}] ".format(**event) level = event["log_level"] # # Twisted's logging supports indicating a python log level, so let's # provide the equivalent to our logging levels. # if level in pythonLogLevelMapping: event["logLevel"] = pythonLogLevelMapping[level] # Format new style -> old style if event["log_format"]: # # Create an object that implements __str__() in order to # defer the work of formatting until it's needed by a # legacy log observer. # class LegacyFormatStub(object): def __str__(oself): return formatEvent(event).encode("utf-8") event["format"] = prefix + "%(log_legacy)s" event["log_legacy"] = LegacyFormatStub() # log.failure() -> isError blah blah if "log_failure" in event: event["failure"] = event["log_failure"] event["isError"] = 1 event["why"] = "{prefix}{message}".format(prefix=prefix, message=formatEvent(event)) self.legacyObserver(**event) # FIXME: This could have a better name. class DefaultLogPublisher(object): """ This observer sets up a set of chained observers as follows: 1. B{rootPublisher} - a L{LogPublisher} 2. B{filters}: a L{FilteringLogObserver} that filters out messages using a L{LogLevelFilterPredicate} 3. B{filteredPublisher} - a L{LogPublisher} 4. B{legacyLogObserver} - a L{LegacyLogObserver} wired up to L{twisted.python.log.msg}. This allows any observers registered with Twisted's logging (that is, most observers in presently use) to receive (filtered) events. The purpose of this class is to provide a default log observer with sufficient hooks to enable applications to add observers that can either receive all log messages, or only log messages that are configured to pass though the L{LogLevelFilterPredicate}:: from twext.python.log import Logger, ILogObserver log = Logger() @implementer(ILogObserver) class AMPObserver(object): def __call__(self, event): # eg.: Hold events in a ring buffer and expose them via AMP. ... @implementer(ILogObserver) class FileObserver(object): def __call__(self, event): # eg.: Take events and write them into a file. ... # Send all events to the AMPObserver log.publisher.addObserver(AMPObserver(), filtered=False) # Send filtered events to the FileObserver log.publisher.addObserver(AMPObserver()) With no observers added, the default behavior is that the legacy Twisted logging system sees messages as controlled by L{LogLevelFilterPredicate}. """ def __init__(self): self.legacyLogObserver = LegacyLogObserver(twistedLogMessage) self.filteredPublisher = LogPublisher(self.legacyLogObserver) self.levels = LogLevelFilterPredicate() self.filters = FilteringLogObserver(self.filteredPublisher, (self.levels,)) self.rootPublisher = LogPublisher(self.filters) def addObserver(self, observer, filtered=True): """ Registers an observer with this publisher. @param observer: An L{ILogObserver} to add. @param filtered: If true, registers C{observer} after filters are applied; otherwise C{observer} will get all events. """ if filtered: self.filteredPublisher.addObserver(observer) self.rootPublisher.removeObserver(observer) else: self.rootPublisher.addObserver(observer) self.filteredPublisher.removeObserver(observer) def removeObserver(self, observer): """ Unregisters an observer with this publisher. @param observer: An L{ILogObserver} to remove. """ self.rootPublisher.removeObserver(observer) self.filteredPublisher.removeObserver(observer) def __call__(self, event): self.rootPublisher(event) Logger.publisher = DefaultLogPublisher() # # Utilities # class CallMapping(object): def __init__(self, submapping): self._submapping = submapping def __getitem__(self, key): callit = key.endswith(u"()") realKey = key[:-2] if callit else key value = self._submapping[realKey] if callit: value = value() return value def formatWithCall(formatString, mapping): """ Format a string like L{unicode.format}, but: - taking only a name mapping; no positional arguments - with the additional syntax that an empty set of parentheses correspond to a formatting item that should be called, and its result C{str}'d, rather than calling C{str} on the element directly as normal. For example:: >>> formatWithCall("{string}, {function()}.", ... dict(string="just a string", ... function=lambda: "a function")) 'just a string, a function.' @param formatString: A PEP-3101 format string. @type formatString: L{unicode} @param mapping: A L{dict}-like object to format. @return: The string with formatted values interpolated. @rtype: L{unicode} """ return unicode( theFormatter.vformat(formatString, (), CallMapping(mapping)) ) theFormatter = Formatter() def replaceTwistedLoggers(): """ Visit all Python modules that have been loaded and: - replace L{twisted.python.log} with a L{LegacyLogger} - replace L{twisted.python.log.msg} with a L{LegacyLogger}'s C{msg} - replace L{twisted.python.log.err} with a L{LegacyLogger}'s C{err} """ log = Logger() for moduleName, module in sys.modules.iteritems(): # Oddly, this happens if module is None: continue # Don't patch Twisted's logging module if module in (twisted.python, twisted.python.log): continue # Don't patch this module if moduleName == __name__: continue for name, obj in module.__dict__.iteritems(): legacyLogger = LegacyLogger(logger=Logger(namespace=module.__name__)) if obj is twisted.python.log: log.info("Replacing Twisted log module object {0} in {1}".format(name, module.__name__)) setattr(module, name, legacyLogger) elif obj is twisted.python.log.msg: log.info("Replacing Twisted log.msg object {0} in {1}".format(name, module.__name__)) setattr(module, name, legacyLogger.msg) elif obj is twisted.python.log.err: log.info("Replacing Twisted log.err object {0} in {1}".format(name, module.__name__)) setattr(module, name, legacyLogger.err) ###################################################################### # FIXME: This may not be needed; look into removing it. class StandardIOObserver(object): """ (Legacy) log observer that writes to standard I/O. """ def emit(self, eventDict): text = None if eventDict["isError"]: output = stderr if "failure" in eventDict: text = eventDict["failure"].getTraceback() else: output = stdout if not text: text = " ".join([str(m) for m in eventDict["message"]]) + "\n" output.write(text) output.flush() def start(self): addObserver(self.emit) def stop(self): removeObserver(self.emit) virtualbricks-1.0.2/virtualbricks/_settings.py000066400000000000000000000107151262207653100216430ustar00rootroot00000000000000# Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import ConfigParser from virtualbricks import tools, log if False: # pyflakes _ = str logger = log.Logger() config_loaded = log.Event("Configuration loaded ({filename})") config_installed = log.Event("Default configuration saved ({filename})") cannot_read_config = log.Event("Cannot read config file {filename}") cannot_save_config = log.Event("Cannot save default configuration") LOCK_FILE = "/tmp/vb.lock" HOME = os.path.expanduser("~") VIRTUALBRICKS_HOME = os.path.join(HOME, ".virtualbricks") CONFIGFILE = os.path.join(HOME, ".virtualbricks.conf") DEFAULT_WORKSPACE = VIRTUALBRICKS_HOME DEFAULT_PROJECT = "new_project" DEFAULT_CONF = { "term": "/usr/bin/xterm", "alt-term": "/usr/bin/gnome-terminal", "sudo": "/usr/bin/gksu", "qemupath": "/usr/bin", "kvm": False, "ksm": False, "kqemu": False, "cdroms": "", "vdepath": "/usr/bin", "python": False, "femaleplugs": False, "erroronloop": False, "systray": True, "workspace": DEFAULT_WORKSPACE, "current_project": DEFAULT_PROJECT, "cowfmt": "qcow2", "show_missing": True } class Settings: class __metaclass__(type): def __new__(cls, name, bases, dct): def make_property(opt): def get(self): return self.config.getboolean(self.DEFAULT_SECTION, opt) dct["get_" + opt] = get dct[opt] = property(get) for opt in dct["__boolean_values__"]: make_property(opt) return type.__new__(cls, name, bases, dct) __boolean_values__ = ('kvm', 'ksm', 'kqemu', 'python', 'femaleplugs', 'erroronloop', 'systray', 'show_missing') DEFAULT_SECTION = "Main" DEFAULT_PROJECT = DEFAULT_PROJECT VIRTUALBRICKS_HOME = VIRTUALBRICKS_HOME DEFAULT_HOME = VIRTUALBRICKS_HOME LOCK_FILE = LOCK_FILE __name__ = "virtualbricks.settings" def __init__(self, filename=CONFIGFILE): self.filename = filename self.config = ConfigParser.SafeConfigParser() self.config.add_section(self.DEFAULT_SECTION) for key, value in DEFAULT_CONF.items(): self.config.set(self.DEFAULT_SECTION, key, str(value)) def __contrains__(self, name): return self.config.has_option(self.DEFAULT_SECTION, name) has_option = __contrains__ def get(self, attr): if attr in self.__boolean_values__: return self.config.getboolean(self.DEFAULT_SECTION, attr) if attr == 'sudo' and os.getuid() == 0: return '' return self.config.get(self.DEFAULT_SECTION, str(attr)) def set(self, attr, value): self.config.set(self.DEFAULT_SECTION, attr, str(value)) def store(self): with open(self.filename, "w") as fp: self.config.write(fp) def load(self): try: parsed = self.config.read(self.filename) if not parsed: self.install() else: logger.info(config_loaded, filename=self.filename) tools.enable_ksm(self.ksm, self.get("sudo")) except ConfigParser.Error: logger.exception(cannot_read_config, filename=self.filename) def install(self): self.set("ksm", tools.check_ksm()) try: self.store() logger.info(config_installed, filename=self.filename) except IOError: logger.exception(cannot_save_config) def install(settings): import sys import virtualbricks if "virtualbricks.settings" in sys.modules: raise RuntimeError("Settings already parsed.") virtualbricks.settings = settings sys.modules["virtualbricks.settings"] = settings virtualbricks-1.0.2/virtualbricks/app.py000066400000000000000000000102031262207653100204140ustar00rootroot00000000000000# Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import print_function __metaclass__ = type import sys from twisted.python import usage, lockfile, reflect from twisted.internet import defer from virtualbricks import _backport, settings _log_file = sys.stdout def file_logger(): from virtualbricks import log return log.FileLogObserver(_log_file) def _file_logger(filename): if filename != "-": from twisted.python import logfile global _log_file _log_file = logfile.LogFile.fromFullPath(filename) return "virtualbricks.app.file_logger" class Options(usage.Options): longdesc = """Virtualbricks - a vde/qemu gui written in python and GTK/Glade. Copyright (C) Virtualbricks team""" optFlags = [ ["noterm", None, "Do not show the terminal."], ["daemon", None, ""] ] optParameters = [ ["logfile", "l", None, "Write log messages to file."], ["logger", None, None, "A fully-qualified name to a log observer factory to use for the " "initial log observer. Takes precedence over --logfile and --syslog " "(when available)."], ] def __init__(self): usage.Options.__init__(self) self["verbosity"] = 0 def opt_logfile(self, arg): """Write log messages to file.""" self["logger"] = _file_logger(arg) def opt_verbose(self): """Increase log verbosity.""" self["verbosity"] += 1 def opt_quiet(self): """Decrease log verbosity.""" self["verbosity"] -= 1 def opt_debug(self): """Verbose debug output""" self["verbosity"] = 2 def opt_version(self): """Print version and exit.""" from virtualbricks import version print("Virtualbrics", version.short()) sys.exit(0) def postOptions(self): if self["logger"]: try: self["logger"] = reflect.namedAny(self["logger"]) except Exception as err: raise usage.UsageError("Logger '%s' could not be imported: %s" % (self['logger'], err)) opt_v = opt_verbose opt_q = opt_quiet opt_b = opt_debug def run_app(Application, config): try: config.parseOptions() except usage.error, ue: raise SystemExit("%s: %s" % (sys.argv[0], ue)) _backport.react(Application(config).run, ()) class _LockedApplication: factory = None def __init__(self, config, lock=None): self.config = config self.lock = lock or lockfile.FilesystemLock(settings.LOCK_FILE) def run(self, reactor): assert self.factory is not None, \ "factory attribute is not set" if self.lock.lock(): reactor.addSystemEventTrigger("after", "shutdown", self.lock.unlock) app = self.factory(self.config) return app.run(reactor) else: msg = ("Another Virtualbricks instance is running and you cannot " "run more than one instance of it. If this is an " "error, please delete %s to start Virtualbricks" % self.lock.name) return defer.fail(SystemExit(msg)) def LockedApplication(factory): def init(config): app = _LockedApplication(config) app.factory = factory return app return init virtualbricks-1.0.2/virtualbricks/base.py000066400000000000000000000173071262207653100205620ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_base -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import re from twisted.python import reflect from virtualbricks import log, observable if False: # pyflakes _ = str __metaclass__ = type logger = log.Logger() attribute_set = log.Event("Attribute {attr} set in {brick} with value " "{value}.") param_not_found = log.Event("Parameter {param} in {brick} not found. " "(val: {value})") class Config(dict): CONFIG_LINE = re.compile(r"^(\w+?)=(.*)$") parameters = {} def __init__(self): parameters = {} reflect.accumulateClassDict(self.__class__, "parameters", parameters) self.parameters = parameters super(Config, self).__init__((n, v.default) for n, v in parameters.iteritems()) # dict interface def __setitem__(self, name, value): if name not in self.parameters: raise ValueError(_("Parameter %s not found") % name) super(Config, self).__setitem__(name, value) # NOTE: old interface, values are always strings def get(self, name, default=None): try: val = dict.__getitem__(self, name) return self.parameters[name].to_string(val) except KeyError: return default # XXX: check this interface def __getattr__(self, name): # return always a string if name not in self.parameters: raise AttributeError(name) return self.parameters[name].to_string(self[name]) def dump(self, write): for key in sorted(self.iterkeys()): write("%s=%s" % (key, self[key])) class Parameter: def __init__(self, default): self.default = default def from_string_brick(self, in_string, brick): return self.from_string(in_string) def to_string_brick(self, in_object, brick): return self.to_string(in_object) def from_string(self, in_string): pass def to_string(self, in_object): pass class Integer(Parameter): from_string = int to_string = str class String(Parameter): def from_string(self, in_string): return in_string def to_string(self, in_object): return in_object class Float(Parameter): from_string = float to_string = repr class SpinMixin: def __init__(self, default=0, min=0, max=100): super(SpinMixin, self).__init__(default) self.min = min self.max = max def assert_in_range(self, i): if not self.min <= i <= self.max: raise ValueError(_("value out range {0} ({1}, {2})").format( i, self.min, self.max)) def from_string(self, in_string): i = super(SpinMixin, self).from_string(in_string) self.assert_in_range(i) return i def to_string(self, in_object): self.assert_in_range(in_object) return super(SpinMixin, self).to_string(in_object) class SpinInt(SpinMixin, Integer): pass class SpinFloat(SpinMixin, Float): pass class Boolean(Parameter): def from_string(self, in_string): return in_string.lower() in set(["true", "*", "yes"]) def to_string(self, in_object): return "*" if in_object else "" class Object(Parameter): """A special parameter that is never translated to or from a string.""" # XXX: pratically the same of a string def from_string(self, in_string): return in_string def to_string(self, in_object): return in_object class ListOf(Parameter): def __init__(self, element_type): # New there is a problem with this approach, the state is shared across # all instances and require that a subclass of Config sets a new value # in its contructor. # XXX: Is this still true? Parameter.__init__(self, []) self.element_type = element_type def from_string(self, in_string): strings = eval(in_string, {}, {}) return map(self.element_type.from_string, strings) def to_string(self, in_object): return str(map(self.element_type.to_string, in_object)) class Base(object): _restore = False # type = None # if not set in a subclass will raise an AttributeError _name = None config_factory = Config logger = log.Logger() def get_name(self): return self._name getname = get_name def set_name(self, name): self._name = name self.notify_changed() name = property(get_name, set_name) def __init__(self, factory, name): self._observable = observable.Observable("changed") self.changed = observable.Event(self._observable, "changed") self.factory = factory self._name = name self.config = self.config_factory() def get_type(self): return self.type def needsudo(self): return False def set(self, attrs): for name, value in attrs.iteritems(): if value != self.config[name]: logger.info(attribute_set, attr=name, brick=self, value=value) self.config[name] = value setter = getattr(self, "cbset_" + name, None) if setter: setter(value) self.notify_changed() def get(self, name): try: return self.config[name] except KeyError: raise KeyError(_("%s config has no %s option.") % (self.name, name)) def _getvalue(self, name, value): try: return self.config.parameters[name].from_string_brick(value, self) except KeyError: logger.error(param_not_found, param=name, brick=self, value=value) raise def load_from(self, section): self.set(dict((n, self._getvalue(n, v)) for n, v in section)) def save_to(self, fileobj): opt_tmp = "{0}={1}" l = [] for name, param in sorted(self.config.parameters.iteritems()): if self.config[name] != param.default: value = param.to_string_brick(self.config[name], self) l.append(opt_tmp.format(name, value)) if l: l.append("") tmp = "[{0}:{1}]\n{2}\n" fileobj.write(tmp.format(self.get_type(), self.name, "\n".join(l))) def rename(self, name): self.set_name(self.factory.normalize_name(name)) def set_restore(self, restore): self._restore = restore def notify_changed(self): if not self._restore: self._observable.notify("changed", self) def __format__(self, format_string): if format_string == "": return repr(self) elif format_string == "s": return self.get_state() elif format_string == "t": return self.get_type() elif format_string == "n": return self.name elif format_string == "p": return self.get_parameters() raise ValueError("Invalid format string %r" % (format_string, )) virtualbricks-1.0.2/virtualbricks/brickfactory.py000066400000000000000000000513371262207653100223330ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_factory -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import errno import sys import termios import tty import re import copy import itertools from twisted.application import app from twisted.internet import defer, task, stdio, error from twisted.protocols import basic from twisted.python import failure, log as legacyLog from twisted.conch.insults import insults from twisted.conch import manhole from virtualbricks import errors, settings, configfile, console, project, log from virtualbricks import events, link, router, switches, tunnels, tuntaps from virtualbricks import virtualmachines, wires from virtualbricks.virtualmachines import is_virtualmachine from virtualbricks import observable from virtualbricks.tools import is_running if False: # pyflakes _ = str logger = log.Logger() reg_basic_types = log.Event("Registering basic types") engine_bye = log.Event("Engine: Bye!") reg_new_type = log.Event("Registering new brick type {type}") type_present = log.Event("Type {type} already present, overriding it") create_image = log.Event("Creating new disk image at '{path}'") remove_socks = log.Event("Removing socks: {socks}") disconnect_plug = log.Event("Disconnecting plug to {sock}") remove_brick = log.Event("Removing brick {brick}") endpoint_not_found = log.Event("Endpoint {nick} not found.") shut_down = log.Event("Server Shut Down.") new_event_ok = log.Event("New event {name} OK") uncaught_exception = log.Event("Uncaught exception: {error()}") brick_stop = log.Event("Error on brick poweroff") def install_brick_types(registry=None): if registry is None: registry = {} logger.debug(reg_basic_types) registry.update({ "switch": switches.Switch, "tap": tuntaps.Tap, "capture": tuntaps.Capture, "vm": virtualmachines.VirtualMachine, "qemu": virtualmachines.VirtualMachine, "wirefilter": wires.Netemu, "netemu": wires.Netemu, "wire": wires.Wire, "tunnelc": tunnels.TunnelConnect, "tunnel client": tunnels.TunnelConnect, "tunnelclient": tunnels.TunnelConnect, "tunnelconnect": tunnels.TunnelConnect, "tunnell": tunnels.TunnelListen, "tunnel server": tunnels.TunnelListen, "tunnelserver": tunnels.TunnelListen, "tunnellisten": tunnels.TunnelListen, "event": events.Event, "switchwrapper": switches.SwitchWrapper, "router": router.Router, }) return registry class BrickFactory(object): """This is the main class for the core engine. All the bricks are created and stored in the factory. It also contains a thread to manage the command console. """ # __restore is True during the restore of the project. Events are not # propagated. __restore = False __signals = ("brick-added", "brick-removed", "brick-changed", "image-added", "image-removed", "image-changed", "event-added", "event-removed", "event-changed", "quit") def __init__(self, quit): self.quit_d = quit self.bricks = [] self.events = [] self.socks = [] self.disk_images = [] self.__factories = install_brick_types() self.__observable = observable.Observable(*self.__signals) self.changed = observable.Event(self.__observable, "brick-changed") def _notify(self, event, *args): # if not self.__restore: self.__observable.notify(event, *args) def quit(self): if any(is_running(brick) for brick in self.bricks): msg = _("Cannot close virtualbricks: there are running bricks") raise errors.BrickRunningError(msg) logger.info(engine_bye) for e in self.events: e.poweroff() self._notify("quit", self) if not self.quit_d.called: self.quit_d.callback(None) def reset(self): if any(is_running(brick) for brick in self.bricks): msg = _("Project cannot be closed: there are running bricks") raise errors.BrickRunningError(msg) # Don't change the list while iterating over it for brick in list(self.bricks): if is_virtualmachine(brick): brick.image_changed.disconnect(self._image_changed) self.del_brick(brick) # Don't change the list while iterating over it for e in list(self.events): self.del_event(e) del self.socks[:] for image in self.disk_images[:]: self.remove_disk_image(image) def register_brick_type(self, factory, *types): """Register a new brick type. Factory argument is a contructor (or factory but factory is overused as term)""" for type in types: logger.debug(reg_new_type, type=type) if type in self.__factories: logger.debug(type_present, type=type) self.__factories[type] = factory def connect(self, name, callback, *args, **kwds): self.__observable.add_observer(name, callback, args, kwds) def disconnect(self, name, callback, *args, **kwds): self.__observable.remove_observer(name, callback, args, kwds) def set_restore(self, restore): # self.__restore = restore pass # Disk Images def new_disk_image(self, name, path, description=""): """Add one disk image to the library.""" logger.info(create_image, path=path) path = os.path.abspath(path) self.assert_path_not_in_use(path) img = virtualmachines.Image(self.normalize_name(name), path, description) self.disk_images.append(img) self._notify("image-added", img) return img def assert_path_not_in_use(self, path): for img in self.disk_images: if img.path == path: raise errors.ImageAlreadyInUseError(path) def remove_disk_image(self, image): self.disk_images.remove(image) self._notify("image-removed", image) def get_image_by_name(self, name): """Return a disk image given its name or {None}.""" for img in self.disk_images: if img.name == name: return img def get_image_by_path(self, path): """Get disk image object from the image library by its path.""" for img in self.disk_images: if img.path == path: return img # Bricks def new_brick(self, type, name, host="", remote=False): """Return a new brick. @param type: The type of new brick. @type type: C{str} @param name: The name for the new brick. Must contains only letters, numbers, underscores, hyphens and points. Must not be already in use. @type name: C{str} @return: the new brick. @raises: InvalidNameError, InvalidTypeError """ try: Type = self.__factories[type.lower()] except KeyError: raise errors.InvalidTypeError(_("Invalid brick type %s") % type) brick = Type(self, self.normalize_name(name)) self.bricks.append(brick) brick.changed.connect(self._brick_changed) if is_virtualmachine(brick): brick.image_changed.connect(self._image_changed) self._notify("brick-added", brick) return brick def dup_brick(self, brick): name = self.next_name("copy_of_" + brick.name) new_brick = self.new_brick(brick.get_type(), name) # Copy only strings, and not objects, into new vm config new_brick.set(copy.deepcopy(brick.config)) for p in brick.plugs: if p.sock is not None: new_brick.connect(p.sock) return new_brick def del_brick(self, brick): if is_running(brick): msg = "Cannot delete brick {0:n}: brick is running".format(brick) raise errors.BrickRunningError(msg) logger.info(remove_brick, brick=brick.name) socks = set(brick.socks) if socks: logger.info(remove_socks, socks=", ".join(s.nickname for s in socks)) for _brick in self.bricks: for plug in _brick.plugs: if plug.configured() and plug.sock in socks: logger.info(disconnect_plug, sock=plug.sock.nickname) plug.disconnect() for sock in [s for s in self.socks if s.brick is brick]: self.socks.remove(sock) for plug in brick.plugs: if plug.configured(): plug.disconnect() self.bricks.remove(brick) brick.changed.disconnect(self._brick_changed) self._notify("brick-removed", brick) def get_brick_by_name(self, name): for b in self.bricks: if b.name == name: return b def _brick_changed(self, brick): self._notify("brick-changed", brick) def _image_changed(self, image): self._notify("image-changed", image) # Events def new_event(self, name): """Create a new event. @arg name: The event name. @type name: C{str} @return: The new created event. @raises: InvalidNameError, InvalidTypeError """ event = events.Event(self, self.normalize_name(name)) logger.debug(new_event_ok, name=event.name) self.events.append(event) event.changed.connect(self._event_changed) self._notify("event-added", event) return event def dup_event(self, event): name = self.next_name("copy_of_" + event.name) new = self.new_event(name) new.config = copy.deepcopy(event.config) return new def del_event(self, event): event.poweroff() event.changed.disconnect(self._event_changed) self.events.remove(event) self._notify("event-removed", event) def get_event_by_name(self, name): for e in self.events: if e.name == name: return e def rename_event(self, event, name): event.name = self.normalize_name(name) self._event_changed(event) def _event_changed(self, event): self._notify("event-changed", event) def next_name(self, name, suffix="_new"): while self.is_in_use(name): name += suffix return name def is_in_use(self, name): """used to determine whether the chosen name can be used or it has already a duplicate among bricks or events.""" for o in itertools.chain(self.bricks, self.events, self.disk_images): if o.name == name: return True return False def normalize_name(self, name): """ Return the new normalized name. @raise InvalidNameError: if the name is invalid (malformatted of contains invalid characters). @rase NameAlreadyInUseError: if the name is already in use. """ if not isinstance(name, str): raise errors.InvalidNameError(_("Name must be a string")) _name = name.strip() if not re.search("\A[a-zA-Z]", _name): msg = _("Name {0} does not start with a " "letter").format(name) raise errors.InvalidNameError(msg) _name = re.sub(' ', '_', _name) if not re.search("\A[a-zA-Z0-9_\.-]+\Z", _name): msg = _("Name must contains only letters, numbers, underscores, " "hyphens and points, {}").format(name) raise errors.InvalidNameError(msg) if self.is_in_use(_name): raise errors.NameAlreadyInUseError(name) return _name def new_plug(self, brick): return link.Plug(brick) def new_sock(self, brick, name=""): sock = link.Sock(brick, name) self.socks.append(sock) return sock def get_sock_by_name(self, name): if name == "_hostonly": return virtualmachines.hostonly_sock for sock in self.socks: if sock.nickname == name: return sock def connect_to(self, brick, nick): endpoint = None if not nick: return None for n in self.socks: if n.nickname == nick: endpoint = n if endpoint is not None: return brick.connect(endpoint) else: logger.debug(endpoint_not_found, nick=nick) return None class Manhole(manhole.Manhole): def connectionMade(self): fd = sys.__stdin__.fileno() self.oldSettings = termios.tcgetattr(fd) tty.setraw(fd) manhole.Manhole.connectionMade(self) def connectionLost(self, reason): termios.tcsetattr(sys.__stdin__.fileno(), termios.TCSANOW, self.oldSettings) manhole.Manhole.connectionLost(self, reason) class Console(basic.LineOnlyReceiver): inner_protocol = None protocol = None delimiter = "\n" def __init__(self, factory, namespace={}): self.factory = factory self.namespace = namespace def _inject_python(self, protocol): def do_python(): """Open a python interpreter. Use ^D (^Z on windows) to exit.""" protocol = insults.ServerProtocol(Manhole, self.namespace) self._switchTo(protocol) protocol.do_python = do_python def _switchTo(self, new_proto): self.inner_protocol = new_proto new_proto.makeConnection(self.transport) def connectionMade(self): if self.protocol is None: self.protocol = console.VBProtocol(self.factory) self._inject_python(self.protocol) self.protocol.makeConnection(self.transport) def dataReceived(self, data): if self.inner_protocol is not None: self.inner_protocol.dataReceived(data) else: basic.LineOnlyReceiver.dataReceived(self, data) def lineReceived(self, line): self.protocol.lineReceived(line) def connectionLost(self, reason): # This method is called for a multitude of reasons, I'm trying to # enumerate them here. if reason.check(error.ConnectionDone): if self.inner_protocol: # 1. Manhole is terminated and the transport close its # connection. Here I want to restart the virtualbricks # protocol. self.inner_protocol.connectionLost(reason) self.inner_protocol = None stdio.StandardIO(self) else: # 2. ^D, twisted.internet.fdesc.readFromFD reads an empty # string and returns ConnectionDone. self.factory.quit() if reason.check(error.ConnectionLost): # 3. The quit deferred is activated, the reactor disconnects all # selectables with ConnectionLost. This method is called twice # after a ^D with a ConnectionDone followed by a ConnectionLost. if self.inner_protocol: # 1. Manhole is terminated and the transport close its # connection. Here I want to restart the virtualbricks # protocol. self.inner_protocol.connectionLost(reason) self.inner_protocol = None else: # 4. An exception is raised inside the protocol, this in an error # in the code, don't quit and reopen the terminal. stdio.StandardIO(self) def AutosaveTimer(factory, interval=180): l = task.LoopingCall(configfile.safe_save, factory) l.start(interval, now=False) return l class AppLogger(app.AppLogger): observer = None def __init__(self, options): self.observerFactory = options.get("logger") def start(self, application): if self.observerFactory is not None: self.observer = self.observerFactory() if self.observer is not None: logger.publisher.addObserver(self.observer, False) legacyLog.defaultObserver.stop() legacyLog.defaultObserver = None legacyLog.addObserver(log.LegacyAdapter()) self._initialLog() def stop(self): logger.info(shut_down) if self.observer is not None: logger.publisher.removeObserver(self.observer) self.observer = None class Application: logger_factory = AppLogger factory_factory = BrickFactory def __init__(self, config): self.config = config self.logger = self.logger_factory(config) def getComponent(self, interface, default): return default def install_locale(self): import locale locale.setlocale(locale.LC_ALL, '') import gettext gettext.install('virtualbricks', codeset='utf8', names=["gettext"]) def install_settings(self): settings.load() def install_stdlog_handler(self): import logging def get_log_level(verbosity): if verbosity >= 2: return logging.DEBUG elif verbosity == 1: return logging.INFO elif verbosity == -1: return logging.ERROR elif verbosity <= -2: return logging.CRITICAL root = logging.getLogger() root.addHandler(log.StdLoggingAdapter()) if self.config["verbosity"]: root.setLevel(get_log_level(self.config["verbosity"])) def install_sys_hooks(self): import threading sys.excepthook = self.excepthook # Workaround for sys.excepthook thread bug # See: http://bugs.python.org/issue1230540#msg91244 old_init = threading.Thread.__init__ def init(self, *args, **kwargs): old_init(self, *args, **kwargs) run_old = self.run def run_with_except_hook(*args, **kw): try: run_old(*args, **kw) except (KeyboardInterrupt, SystemExit): raise except: sys.excepthook(*sys.exc_info()) self.run = run_with_except_hook threading.Thread.__init__ = init def excepthook(self, exc_type, exc_value, traceback): if exc_type in (SystemExit, KeyboardInterrupt): sys.__excepthook__(exc_type, exc_value, traceback) else: fail = failure.Failure(exc_value, exc_type, traceback) logger.error(uncaught_exception, log_failure=fail, error=lambda: fail.getErrorMessage()) def install_home(self): try: os.mkdir(settings.VIRTUALBRICKS_HOME) except OSError as e: if e.errno != errno.EEXIST: raise def get_namespace(self): return {} def run(self, reactor): self.install_locale() self.install_settings() self.install_stdlog_handler() self.logger.start(self) self.install_home() quit = defer.Deferred() factory = self.factory_factory(quit) self._run(factory) if self.config["verbosity"] >= 2 and not self.config["daemon"]: import signal import pdb signal.signal(signal.SIGUSR2, lambda *args: pdb.set_trace()) signal.signal(signal.SIGINT, lambda *args: pdb.set_trace()) app.fixPdb() reactor.addSystemEventTrigger("before", "shutdown", settings.store) project.manager.restore_last(factory) reactor.addSystemEventTrigger("before", "shutdown", project.manager.save_current, factory) reactor.addSystemEventTrigger("before", "shutdown", self.logger.stop) AutosaveTimer(factory) if not self.config["noterm"] and not self.config["daemon"]: namespace = self.get_namespace() namespace["factory"] = factory stdio.StandardIO(Console(factory, namespace)) # delay as much as possible the installation of hooks because the # exception hook can hide errors in the code requiring to start the # application again with logging redirected self.install_sys_hooks() return quit def _run(self, factory): pass virtualbricks-1.0.2/virtualbricks/bricks.py000066400000000000000000000324271262207653100211250ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_bricks -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import collections import functools import re from twisted.internet import protocol, reactor, error, defer from zope.interface import implementer from virtualbricks import base, errors, settings, log, interfaces from virtualbricks.base import (Config as _Config, Parameter, String, Integer, SpinInt, Float, SpinFloat, Boolean, Object, ListOf) __all__ = ["Brick", "Config", "Parameter", "String", "Integer", "SpinInt", "Float", "SpinFloat", "Boolean", "Object", "ListOf"] if False: # pyflakes _ = str logger = log.Logger(__name__) process_started = log.Event("Process started") process_terminated = log.Event("Process terminated. {status()}") process_done = log.Event("Process terminated") event_unavailable = log.Event("Warning. The Event {name} attached to Brick " "{brick} is not available. Skipping execution.") shutdown_brick = log.Event("Shutting down {name} (pid: {pid})") start_brick = log.Event("Starting: {args()}") open_console = log.Event("Opening console for {name}\n%{args()}\n") console_done = log.Event("Console terminated\n{status}") console_terminated = log.Event("Console terminated\n{status}\nProcess stdout:" "\n{out()}\nProcess stderr:\n{err()}\n") invalid_ack = log.Event("ACK received but no command sent.") class ProcessLogger(object): def __init__(self, logger): self.logger = logger def __get__(self, instance, owner): if instance is not None: logger = self.logger.__get__(instance, owner) logger.emit = functools.partial(logger.emit, pid=instance.pid) return logger return self.logger.__get__(instance, owner) @implementer(interfaces.IProcess) class Process(protocol.ProcessProtocol): logger = ProcessLogger(log.Logger()) debug = True debug_child = True def __init__(self, brick): self.brick = brick def connectionMade(self): self.logger.info(process_started) self.brick.process_started(self) def processEnded(self, status): if status.check(error.ProcessTerminated): self.logger.error(process_terminated, status=lambda: " ".join(status.value.args)) else: assert status.check(error.ProcessDone) self.logger.info(process_terminated, status=lambda: "") self.brick.process_ended(self, status) def outReceived(self, data): self.logger.info(data) def errReceived(self, data): self.logger.error(data, hide_to_user=True) # new interface @property def pid(self): return self.transport.pid def signal_process(self, signalID): self.transport.signalProcess(signalID) def write(self, data): self.transport.write(data) @implementer(interfaces.IProcess) class FakeProcess: pid = -1 def __init__(self, brick): self.brick = brick def signal_process(self, signo): pass def write(self, data): pass class VDEProcessProtocol(Process): """ Handle the VDE management console. Commands are serialized, until an ACK is received, the next command is not sent. @cvar delimiter: The line-ending delimiter to use. """ _buffer = "" delimiter = "\n" prompt = re.compile(r"^vde(?:\[[^]]*\]:|\$) ", re.MULTILINE) PIPELINE_SIZE = 1 def __init__(self, brick): Process.__init__(self, brick) self.queue = collections.deque() def data_received(self, data): """ Translates bytes into lines, and calls ack_received. """ acks = self.prompt.split(self._buffer + data) self._buffer = acks.pop(-1) for ack in acks: self.ack_received(ack) def ack_received(self, ack): self.logger.info(ack) try: self.queue.popleft() except IndexError: self.logger.warn(invalid_ack) self.transport.loseConnection() else: if len(self.queue): self._send_command() def send_command(self, cmd): self.queue.append(cmd) if 0 < len(self.queue) <= self.PIPELINE_SIZE: self._send_command() def _send_command(self): cmd = self.queue[0] self.logger.info(cmd) if cmd.endswith(self.delimiter): return self.transport.write(cmd) return self.transport.writeSequence((cmd, self.delimiter)) def outReceived(self, data): self.data_received(data) def write(self, cmd): self.send_command(cmd) class TermProtocol(protocol.ProcessProtocol): logger = log.Logger() def __init__(self): self.out = [] self.err = [] def connectionMade(self): self.transport.closeStdin() def outReceived(self, data): self.out.append(data) def errReceived(self, data): self.err.append(data) def processEnded(self, status): if isinstance(status.value, error.ProcessTerminated): self.logger.error(console_terminated, status=status.value, out=lambda: "".join(self.out), err=lambda: "".join(self.err)) else: self.logger.info(console_done, status=status.value) class Config(_Config): parameters = {"pon_vbevent": String(""), "poff_vbevent": String("")} class Brick(base.Base): proc = None command_builder = {} term_command = "vdeterm" _started_d = None _exited_d = None _last_status = None process_protocol = VDEProcessProtocol config_factory = Config @property def pid(self): if self.proc is None: return -1 return self.proc.pid def __init__(self, factory, name): base.Base.__init__(self, factory, name) self.plugs = [] self.socks = [] self.config_socks = [] # IBrick interface def poweron(self): if self.proc is not None: return defer.succeed(self) if not self.configured(): return defer.fail(errors.BadConfigError( _("Cannot start '%s': not configured") % self.name)) if not self._properly_connected(): return defer.fail(errors.NotConnectedError( _("Cannot start '%s': not connected") % self.name)) self._started_d = started = defer.Deferred() self._exited_d = defer.Deferred() d = self._check_links() d.addCallback(self._poweron) def start_related_events(_): self._start_related_events(on=True) return self d.addCallback(start_related_events) def eb(failure): if failure.check(defer.FirstError): failure = failure.value.subFailure started.errback(failure) # here self._started_d could be None because if child process is # created before reaching this point, process_stated is already called # and then self._started_d is unset d.addErrback(eb) return started def poweroff(self, kill=False): if self.proc is None: return defer.succeed((self, self._last_status)) logger.info(shutdown_brick, name=self.name, pid=self.proc.pid) try: self.proc.signal_process("KILL" if kill else "TERM") except OSError as e: return defer.fail(e) except error.ProcessExitedAlready: pass return self._exited_d def get_parameters(self): raise NotImplementedError("Bricks.get_parameters() not implemented") def configure(self, attrlist): attrs = {} for name, value in (a.split("=", 2) for a in attrlist): attrs[name] = self.config.parameters[name].from_string(value) self.set(attrs) def send_signal(self, signal): if self.proc: self.proc.signal_process(signal) # brick <--> process interface def process_started(self, proc): started, self._started_d = self._started_d, None started.callback(self) self.notify_changed() def process_ended(self, proc, status): self.proc = None self._start_related_events(off=True) self._last_status = status # ovvensive programming, raise an exception instead of hide the error # behind a lambda (lambda _: None) exited, self._exited_d = self._exited_d, None exited.callback((self, status)) self.notify_changed() # Interal interface def _properly_connected(self): return all(plug.configured() for plug in self.plugs) def configured(self): return False def _check_links(self): l = [plug.connected() for plug in self.plugs] return defer.DeferredList(l, fireOnOneErrback=True, consumeErrors=True) def args(self): return [self.prog()] + self.build_cmd_line() def prog(self): raise NotImplementedError(_("Brick.prog() not implemented.")) def build_cmd_line(self): # TODO: documents the behavior of all cases (#, *, etc.) res = [] for switch, value in self.command_builder.items(): if not switch.startswith("#"): if callable(value): value = value() else: value = self.config.get(value) if value is "*": res.append(switch) elif value is not None and len(value) > 0: if not switch.startswith("*"): res.append(switch) res.append(value) return res def _poweron(self, ignore): def start_process(value): prog, args = value logger.info(start_brick, args=lambda: " ".join(args)) # usePTY? if self.needsudo(): prog = settings.get("sudo") args = [settings.get("sudo"), "--"] + args self.proc = self.process_protocol(self) reactor.spawnProcess(self.proc, prog, args, os.environ) l = [defer.maybeDeferred(self.prog), defer.maybeDeferred(self.args)] d = defer.gatherResults(l, consumeErrors=True) d.addCallback(start_process) return d def _start_related_events(self, on=True, off=False): if on and self.config["pon_vbevent"]: name = self.config["pon_vbevent"] elif off and self.config["poff_vbevent"]: name = self.config["poff_vbevent"] else: return event = self.factory.get_event_by_name(name) if event: event.poweron() else: logger.info(event_unavailable, name=name, brick=self.name) ############################# # Console related operations. ############################# def path(self): return "%s/%s.ctl" % (settings.VIRTUALBRICKS_HOME, self.name) def console(self): return "%s/%s.mgmt" % (settings.VIRTUALBRICKS_HOME, self.name) def connect(self, endpoint, *args): for p in self.plugs: if not p.configured(): p.connect(endpoint) self.notify_changed() return def disconnect(self): for p in self.plugs: if p.configured(): p.disconnect() self.notify_changed() ############################ ########### Poweron/Poweroff ############################ def open_console(self): term = settings.get("term") args = [term, "-e", os.path.join(settings.get("vdepath"), self.term_command), self.console()] get_args = lambda: " ".join(args) logger.info(open_console, name=self.name, args=get_args) reactor.spawnProcess(TermProtocol(), term, args, os.environ) def send(self, data): if self.proc: self.proc.write(data) def get_state(self): """return state of the brick""" if self.proc is not None: state = _("running") elif not self._properly_connected(): state = _("disconnected") else: state = _("off") return state def __isrunning__(self): return self.proc is not None def __format__(self, format_string): if format_string == "d": if self.pid == -10: return "python-thread " return str(self.pid) return base.Base.__format__(self, format_string) def __repr__(self): return "<{0.type} {0.name}>".format(self) virtualbricks-1.0.2/virtualbricks/configfile.py000066400000000000000000000271141262207653100217520ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_configfile -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import os.path import errno import traceback import contextlib from twisted.python import filepath from zope.interface import implementer from virtualbricks import interfaces, settings, configparser, log if False: # pyflakes _ = str __all__ = ["BrickBuilder", "ConfigFile", "EventBuilder", "ImageBuilder", "LinkBuilder", "SockBuilder", "log_events", "restore", "safe_save", "save"] logger = log.Logger() link_type_error = log.Event("Cannot find link of type {type}") brick_not_found = log.Event("Cannot find brick {brick}, skipping line {line}") sock_not_found = log.Event("Cannot find sock {sockname}, skipping line {line}") link_added = log.Event("Added {type} to {brick}") cannot_save_backup = log.Event("Cannot save to backup file {filename}.\n" "{traceback}") project_saved = log.Event("Saved project to {filename}.") cannot_restore_backup = log.Event("Cannot restore backup file {filename}.\n" "{traceback}") backup_restored = log.Event("A backup file for the current project has been " "restored.\nYou can find more informations " "looking in View->Messages.") image_found = log.Event("Found Disk image {name}") skip_image = log.Event("Skipping disk image, name '{name}' already in use") skip_image_noa = log.Event("Cannot access image file, skipping") config_dump = log.Event("CONFIG DUMP on {path}") open_project = log.Event("Open project at {path}") config_save_error = log.Event("Error while saving configuration file") log_events = [link_type_error, brick_not_found, sock_not_found, link_added, cannot_save_backup, project_saved, cannot_restore_backup, backup_restored, image_found, skip_image, skip_image_noa, config_dump, open_project, config_save_error] @contextlib.contextmanager def backup(original, fbackup): try: original.copyTo(fbackup) except OSError as e: if e.errno == errno.ENOENT: yield else: yield fbackup.remove() def restore_backup(filename, fbackup): filename_back = filename.sibling(filename.basename() + ".back") created = False try: filename.moveTo(filename_back) created = True except OSError as e: if e.errno == errno.ENOENT: pass else: logger.error(cannot_save_backup, filename=filename_back, traceback=traceback.format_exc()) else: logger.info(project_saved, filename=filename_back) try: fbackup.moveTo(filename) except OSError as e: if created: created = False filename_back.moveTo(filename) if e.errno == errno.ENOENT: pass else: logger.warn(cannot_restore_backup, filename=fbackup, traceback=traceback.format_exc()) else: logger.warn(backup_restored, hide_to_user=True) if created: filename_back.remove() @contextlib.contextmanager def freeze_notify(obj): obj.set_restore(True) try: yield finally: obj.set_restore(False) @implementer(interfaces.IBuilder) class SockBuilder: def load_from(self, factory, sock): brick = factory.get_brick_by_name(sock.owner) if brick: brick.add_sock(sock.mac, sock.model) logger.info(link_added, type=sock.type, brick=sock.owner) else: logger.warn(brick_not_found, brick=sock.owner, line="|".join(sock)) @implementer(interfaces.IBuilder) class LinkBuilder: def load_from(self, factory, link): brick = factory.get_brick_by_name(link.owner) if brick: sock = factory.get_sock_by_name(link.sockname) if sock: brick.connect(sock, link.mac, link.model) logger.info(link_added, type=link.type, brick=link.owner) else: logger.warn(sock_not_found, sockname=link.sockname, line="|".join(link)) else: logger.warn(brick_not_found, brick=link.owner, line="|".join(link)) def link_builder_factory(context): if context.type == "sock": return SockBuilder() elif context.type == "link": return LinkBuilder() interfaces.registerAdapter(link_builder_factory, configparser.Link, interfaces.IBuilder) @implementer(interfaces.IBuilder) class ImageBuilder: def __init__(self, name): self.name = name def load_from(self, factory, section): logger.debug(image_found, name=self.name) path = dict(section).get("path", "") if factory.is_in_use(self.name): logger.info(skip_image, name=self.name) elif not os.access(path, os.R_OK): logger.info(skip_image_noa) else: return factory.new_disk_image(self.name, path) @implementer(interfaces.IBuilder) class EventBuilder: def __init__(self, name): self.name = name def load_from(self, factory, section): event = factory.new_event(self.name) with freeze_notify(event): event.load_from(section) @implementer(interfaces.IBuilder) class BrickBuilder: def __init__(self, type, name): self.type = type self.name = name def load_from(self, factory, section): brick = factory.new_brick(self.type, self.name) with freeze_notify(brick): brick.load_from(section) @implementer(interfaces.IBuilder) class SectionConsumer: def load_from(self, factory, section): for n, v in section: pass def brick_builder_factory(context): if context.type == "Image": return ImageBuilder(context.name) elif context.type == "Event": return EventBuilder(context.name) else: return BrickBuilder(context.type, context.name) class CompatibleBuilder: incompatibles = frozenset() def __init__(self, type, name): self.type = type self.name = name def transform(self, attr, value): raise NotImplementedError() def load_from(self, factory, section): params = [] for attr, value in section: if attr in self.incompatibles: t = self.trasform(attr, value) if t: params.append(t) else: params.append((attr, value)) return BrickBuilder(self.type, self.name).load_from(factory, params) @implementer(interfaces.IBuilder) class CompatibleVMBuilder(CompatibleBuilder): type = "Qemu" incompatibles = frozenset(["basehda", "basehdb", "basehdc", "basehdd", "basefda", "basefdb", "basemtdblock", "usbdevlist"]) def __init__(self, name): self.name = name def trasform(self, attr, value): if attr.startswith("base"): return attr[4:], value return @implementer(interfaces.IBuilder) class CompatibleSwitchWrapperBuilder(CompatibleBuilder): type = "SwitchWrapper" incompatibles = frozenset(["numports"]) def __init__(self, name): self.name = name def trasform(self, attr, value): return def compatible_brick_builder_factory(context): if context.type == "Project": return SectionConsumer() elif context.type == "DiskImage": context.type = "Image" elif context.type == "Qemu": return CompatibleVMBuilder(context.name) elif context.type == "SwitchWrapper": return CompatibleSwitchWrapperBuilder(context.name) return brick_builder_factory(context) interfaces.registerAdapter(compatible_brick_builder_factory, configparser.Section, interfaces.IBuilder) class ConfigFile: def save(self, factory, str_or_obj): """Save the current project. @param obj_or_str: The filename of file object where to save the project. @type obj_or_str: C{str} or an object that implements the file interface. """ if isinstance(str_or_obj, (basestring, filepath.FilePath)): if isinstance(str_or_obj, basestring): fp = filepath.FilePath(str_or_obj) else: fp = str_or_obj logger.debug(config_dump, path=fp.path) with backup(fp, fp.sibling(fp.basename() + "~")): tmpfile = fp.sibling("." + fp.basename() + ".sav") with tmpfile.open("w") as fd: self.save_to(factory, fd) tmpfile.moveTo(fp) else: self.save_to(factory, str_or_obj) def save_to(self, factory, fileobj): for img in factory.disk_images: img.save_to(fileobj) for event in factory.events: event.save_to(fileobj) socks = [] plugs = [] for brick in iter(factory.bricks): brick.save_to(fileobj) if brick.get_type() == "Qemu": socks.extend(brick.socks) plugs.extend(brick.plugs) for sock in socks: t = "sock|{s.brick.name}|{s.nickname}|{s.model}|{s.mac}\n" fileobj.write(t.format(s=sock)) for plug in plugs: plug.save_to(fileobj) def restore(self, factory, str_or_obj): if isinstance(str_or_obj, (basestring, filepath.FilePath)): if isinstance(str_or_obj, basestring): fp = filepath.FilePath(str_or_obj) else: fp = str_or_obj restore_backup(fp, fp.sibling(fp.basename() + "~")) logger.info(open_project, path=fp.path) with fp.open() as fd: self.restore_from(factory, fd) else: self.restore_from(factory, str_or_obj) def restore_from(self, factory, fileobj): with freeze_notify(factory): for item in configparser.Parser(fileobj): interfaces.IBuilder(item).load_from(factory, item) _config = ConfigFile() def save(factory, filename=None): if filename is None: workspace = settings.get("workspace") project = settings.get("current_project") filename = os.path.join(workspace, project, ".project") _config.save(factory, filename) def safe_save(factory, filename=None): try: save(factory, filename) except Exception: logger.exception(config_save_error) def restore(factory, filename=None): if filename is None: workspace = settings.get("workspace") project = settings.get("current_project") filename = os.path.join(workspace, project, ".project") _config.restore(factory, filename) virtualbricks-1.0.2/virtualbricks/configparser.py000066400000000000000000000062701262207653100223270ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_configfile.TestParser -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import re import collections __metaclass__ = type class Section: EMPTY = re.compile(r"^\s*$") CONFIG_LINE = re.compile(r"^(\w+)\s*=\s*(.*)$") def __init__(self, type, name, fileobj): self.type = type self.name = name self.fileobj = fileobj def __iter__(self): curpos = self.fileobj.tell() line = self.fileobj.readline() while line: if line.startswith("#") or self.EMPTY.match(line): curpos = self.fileobj.tell() line = self.fileobj.readline() continue match = self.CONFIG_LINE.match(line) if match: name, value = match.groups() if value is None: # value is None when the parameter is not set value = "" yield name, value curpos = self.fileobj.tell() line = self.fileobj.readline() else: self.fileobj.seek(curpos) return Link = collections.namedtuple("Link", ["type", "owner", "sockname", "model", "mac"]) class Parser: EMPTY = re.compile(r"^\s*$") SECTION_HEADER = re.compile(r"^\[([a-zA-Z0-9_]+):(.+)\]$") LINK = re.compile(r"^(?Plink|sock)\|" "(?P[a-zA-Z][\w.-]*)\|" "(?P[a-zA-Z_][\w.-]*)\|" "(?P\w*)\|" "(?P(?:(?:[0-9a-hA-H]{2}:){5}[0-9a-hA-H]{2})|)$") def __init__(self, fileobj): self.fileobj = fileobj def __iter__(self): """Iter through sections. There are two kinds of sections: bricks, events and images are one kind of section and links and socks are the second kind of section. """ line = self.fileobj.readline() while line: if line.startswith("#") or self.EMPTY.match(line): line = self.fileobj.readline() continue match = self.SECTION_HEADER.match(line) if match: yield Section(match.group(1), match.group(2), self.fileobj) else: match = self.LINK.match(line) if match: yield Link._make(match.groups()) line = self.fileobj.readline() virtualbricks-1.0.2/virtualbricks/console.py000066400000000000000000000301131262207653100213000ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_console -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import textwrap from twisted.internet import interfaces, utils from twisted.protocols import basic from zope.interface import implementer from virtualbricks import version, bricks, errors, log, settings logger = log.Logger() socket_error = log.Event("Error on socket") qemu_not_vde = log.Event("Qemu but not VDE plug") invalid_brick = log.Event("Not a Qemu Plug") conn_ok = log.Event("Connection ok") conn_failed = log.Event("Connection failed") quit_loop = log.Event("Quitting command loop") if False: # pyflakes _ = str class _Error(Exception): """Please don't use.""" class String(str): def __eq__(self, other): if not isinstance(other, self.__class__): return False return str.__eq__(self, other) def __ne__(self, other): return not self == other def __hash__(self): return str.__hash__(self) class VbShellCommand(String): def perform(self, factory): parse(factory, self) class ShellCommand(String): def perform(self, factory): return utils.getProcessValue("sh", ("-c", self), os.environ) @implementer(interfaces.ITransport) class NullTransportAdapter: write = writeSequence = lambda s, d: None __init__ = loseConnection = getPeer = getHost = lambda s: None def parse(factory, command, console=None): protocol = VBProtocol(factory) transport = interfaces.ITransport(console, NullTransportAdapter()) protocol.makeConnection(transport) protocol.lineReceived(command) class Protocol(basic.LineOnlyReceiver): def __init__(self, factory): self.factory = factory self.sub_protocols = {} def lineReceived(self, line): parts = line.split() if parts: handler = getattr(self, "do_" + parts[0], None) if handler is not None: try: handler(*parts[1:]) except TypeError: self.sendLine("invalid number of arguments") except Exception as e: self.sendLine(str(e)) else: self.default(line) def default(self, line): pass def connectionMade(self): for protocol in self.sub_protocols.itervalues(): protocol.makeConnection(self.transport) def connectionLost(self, reason): for protocol in self.sub_protocols.itervalues(): protocol.connectionLost(reason) class VBProtocol(Protocol): """\ Base commands ----------------------------------------------------- h[elp] print this help ps List of active process n[ew] TYPE NAME Create a new TYPE brick with NAME list List of bricks already created socks List of connections available for bricks conn[ections] List of connections for each bricks reset Remove all the bricks and events quit Stop virtualbricks event *args TODO brick *args TODO Brick configuration command --------------------------------------- BRICK_NAME show List parameters of BRICK_NAME brick BRICK_NAME on Starts BRICK_NAME BRICK_NAME off Stops BRICK_NAME BRICK_NAME remove Delete BRICK_NAME BRICK_NAME config PARM=VALUE Configure a parameter of BRICK_NAME BRICK_NAME connect NICK Connect BRICK_NAME to a Sock BRICK_NAME disconnect Disconnect BRICK_NAME to a sock BRICK_NAME help Help about parameters of BRICK_NAME """ # _is_first = False delimiter = "\n" prompt = "virtualbricks> " intro = ("Virtualbricks, version {version}\n" "Copyright (C) 2013 Virtualbricks team\n" "This is free software; see the source code for copying conditions.\n" "There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or\n" "FITNESS FOR A PARTICULAR PURPOSE. For details, type `warranty'.\n\n") def __init__(self, factory): Protocol.__init__(self, factory) imgp = ImagesProtocol(factory) self.sub_protocols["images"] = imgp cfgp = ConfigurationProtocol(factory) self.sub_protocols["config"] = cfgp def connectionMade(self): Protocol.connectionMade(self) # if not self._is_first: # self._is_first = True # intro = self.intro.format(version=virtualbricks.version.short()) # self.transport.write(intro) intro = self.intro.format(version=version.short()) self.transport.write(intro) self.transport.write(self.prompt) def lineReceived(self, line): Protocol.lineReceived(self, line) if line != "python": # :-( self.transport.write(self.prompt) def brick_action(self, obj, cmd): """brick action dispatcher""" if cmd[0] == "on": obj.poweron() elif cmd[0] == "off": obj.poweroff() elif cmd[0] == "remove": if obj.get_type() == "Event": self.factory.del_event(obj) elif isinstance(obj, bricks.Brick): self.factory.del_brick(obj) else: raise errors.UnmanagedTypeError("Unknown type %s", obj.__class__.__name__) elif cmd[0] == "config": obj.configure(cmd[1:]) elif cmd[0] == "show": obj.config.dump(self.sendLine) elif cmd[0] == "connect" and len(cmd) == 2: if self.connect_to(obj, cmd[1].rstrip("\n")) is not None: logger.info(conn_ok) else: logger.info(conn_failed) elif cmd[0] == "disconnect": obj.disconnect() def default(self, line): # line = line.strip() args = line.split() obj = self.factory.get_brick_by_name(args[0]) if obj is None: obj = self.factory.get_event_by_name(args[0]) if obj is None: self.sendLine("Invalid console command '%s'" % line) return self.brick_action(obj, args[1:]) def do_quit(self): self.factory.quit() logger.info(quit_loop) def do_help(self): self.sendLine(textwrap.dedent(self.__doc__)) def do_event(self, name, *args): event = self.factory.get_event_by_name(name) if event is not None: self.brick_action(event, *args) else: self.sendLine("No such event '%s'" % name) def do_brick(self, name, *args): brick = self.factory.get_brick_by_name(name) if brick is not None: self.brick_action(brick, *args) else: self.sendLine("No such event '%s'" % name) def do_ps(self): """List of active processes""" procs = [b for b in self.factory.bricks if b.proc] if not procs: self.sendLine("No process running") else: self.sendLine("PID\tType\tName") self.sendLine("-" * 24) for b in procs: self.sendLine("%d\t%s\t%s" % (b.pid, b.get_type(), b.name)) def do_reset(self): self.factory.reset() def do_new(self, typ, name): """Create a new brick or event""" if typ == "event": self.factory.new_event(name) else: try: self.factory.new_brick(typ, name) except (errors.InvalidTypeError, errors.InvalidNameError), e: self.sendLine(str(e)) def do_list(self): """List of bricks already created""" self.sendLine("Bricks") self.sendLine("-" * 20) for obj in self.factory.bricks: self.sendLine("%s (%s)" % (obj.name, obj.get_type())) self.sendLine("\nEvents") self.sendLine("-" * 20) for obj in self.factory.events: self.sendLine("%s (%s)" % (obj.name, obj.get_type())) # self.sendLine("End of list.") def do_config(self, *args): self.sub_protocols["config"].lineReceived(" ".join(args)) def do_images(self, *args): self.sub_protocols["images"].lineReceived(" ".join(args)) def do_socks(self): """List of connections available for bricks""" # XXX: if brick is not a switch this raise an exception for s in self.factory.socks: if s.brick is not None: self.sendLine("%s - port on %s %s - %d available" % ( s.nickname, s.brick.get_type(), s.brick.name, s.get_free_ports())) else: self.sendLine("%s, not configured." % s.nickname) def do_connections(self): """List of connections for each brick""" for b in iter(self.factory.bricks): self.sendLine("Connections from %s brick:" % b.name) for sk in b.socks: if b.get_type() == "Qemu": s = "\tsock connected to %s with an %s (%s) card" self.sendLine(s % (sk.nickname, sk.model, sk.mac)) for pl in b.plugs: if b.get_type() == "Qemu": if pl.mode == "vde": s = "\tlink connected to %s with a %s (%s) card" self.sendLine(s % (pl.sock.nickname, pl.model, pl.mac)) else: s = "\tuserlink connected with a %s (%s) card" self.sendLine(s % (pl.model, pl.mac)) elif (pl.sock is not None): self.sendLine("\tlink: %s " % pl.sock.nickname) # easter eggs def do_warranty(self): self.sendLine("NotImplementedError") do_q = do_quit do_h = do_help do_n = do_new do_cfg = do_config do_i = do_images do_conn = do_connections class ImagesProtocol(Protocol): def do_list(self): for img in self.factory.disk_images: self.sendLine("%s, %s" % (img.name, img.path)) # def do_files(self): # dirname = settings.get("baseimages") # for image_file in os.listdir(dirname): # if os.path.isfile(dirname + "/" + image_file): # self.sendLine(image_file) # def do_add(self, name): # basepath = settings.get("baseimages") # name = name.replace(".", "_") # name = name.replace("/", "_") # self.factory.new_disk_image(name, basepath + "/" + name) # def do_del(self, name): # image = self.factory.get_image_by_name(name) # if image is not None: # self.factory.remove_disk_image(image) # def do_base(self, cmd="", base=""): # if not cmd or cmd == "show": # self.sendLine(settings.get("baseimages")) # elif cmd == "set" and base: # settings.set("baseimages", base) class ConfigurationProtocol(Protocol): def do_get(self, name): # if name: if settings.has_option(name): self.sendLine("%s = %s" % (name, settings.get(name))) else: self.sendLine("No such option %s" % name) # elif len(args) == 0: # pass # TODO: show all settings def do_set(self, name, value): if settings.has_option(name): settings.set(name, value) else: self.sendLine("No such option %s" % name) virtualbricks-1.0.2/virtualbricks/errors.py000066400000000000000000000040541262207653100211570ustar00rootroot00000000000000# Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. class Error(Exception): pass class InvalidNameError(Error): pass class NameAlreadyInUseError(InvalidNameError): def __init__(self, name): InvalidNameError.__init__(self, name) self.name = name def __str__(self): return _("Normalized name %s already in use") % self.name class InvalidTypeError(Error, ValueError): pass class BadConfigError(Error): pass class NotConnectedError(Error): pass class LinkLoopError(Error): pass class UnmanagedTypeError(Error): pass class InvalidActionError(Error): pass class LockedImageError(Error): def __init__(self, image, master): Exception.__init__(self, image, master) self.image = image self.master = master def __repr__(self): return "Image {0} already locked by {1}".format(self.image, self.master) class ImageAlreadyInUseError(Error): pass # Project specific errors class ProjectExistsError(InvalidNameError): pass class ProjectNotExistsError(InvalidNameError): pass class InvalidArchiveError(Error): """The archive format is not recognized.""" class BrickRunningError(Error): """There is one or more brick that is running.""" virtualbricks-1.0.2/virtualbricks/events.py000066400000000000000000000111731262207653100211470ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_events -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from twisted.internet import reactor, defer from virtualbricks import base, errors, console, log if False: # pyflakes _ = str process_ended = log.Event("Process ended with exit code {code}") event_error = log.Event("Error in event action. See the log for more " "informations") class Command(base.String): def from_string(self, in_object): if in_object.startswith("add "): factory = console.VbShellCommand elif in_object.startswith("addsh "): factory = console.ShellCommand else: raise RuntimeError() return factory(in_object.split(" ", 1)[1]) def to_string(self, in_object): if isinstance(in_object, console.VbShellCommand): return "add " + in_object elif isinstance(in_object, console.ShellCommand): return "addsh " + in_object else: raise RuntimeError(_("Invalid command type.")) class EventConfig(base.Config): parameters = {"actions": base.ListOf(Command("")), "delay": base.Integer(0)} def __init__(self): base.Config.__init__(self) self["actions"] = [] class Event(base.Base): type = "Event" scheduled = None config_factory = EventConfig def __isrunning__(self): return self.scheduled is not None def get_state(self): """Return state of the event""" if self.scheduled is not None: state = _("running") elif not self.configured(): state = _("unconfigured") else: state = _("off") return state def configured(self): return len(self.config["actions"]) > 0 and self.config["delay"] > 0 def get_parameters(self): tempstr = _("Delay: %d") % self.config["delay"] if len(self.config["actions"]) > 0: tempstr += "; " + _("Actions:") # Add actions cutting the tail if it's too long for s in self.config["actions"]: if isinstance(s, console.ShellCommand): tempstr += " \"*%s\"," % s else: tempstr += " \"%s\"," % s # Remove the last character tempstr = tempstr[0:-1] return tempstr # def connect(self, endpoint): # return True # def disconnect(self): # return ############################ ########### Poweron/Poweroff ############################ def poweron(self): if self.scheduled: return if not self.configured(): raise errors.BadConfigError("Event %s not configured" % self.name) deferred = defer.Deferred() self.scheduled = reactor.callLater(self.config["delay"], self.do_actions, deferred) self.notify_changed() return deferred def poweroff(self): if self.scheduled is None: return self.scheduled.cancel() self.scheduled = None self.notify_changed() def toggle(self): if self.scheduled is not None: self.poweroff() return defer.succeed(self) else: return self.poweron() def do_actions(self, deferred): def log_err(results): for success, status in results: if success: self.logger.info(process_ended, code=status) else: self.logger.error(event_error, log_failure=status) return self self.scheduled = None procs = [defer.maybeDeferred(action.perform, self.factory) for action in self.config["actions"]] dl = defer.DeferredList(procs, consumeErrors=True).addCallback(log_err) dl.chainDeferred(deferred) self.notify_changed() virtualbricks-1.0.2/virtualbricks/gui/000077500000000000000000000000001262207653100200525ustar00rootroot00000000000000virtualbricks-1.0.2/virtualbricks/gui/__init__.py000066400000000000000000000000001262207653100221510ustar00rootroot00000000000000virtualbricks-1.0.2/virtualbricks/gui/data/000077500000000000000000000000001262207653100207635ustar00rootroot00000000000000virtualbricks-1.0.2/virtualbricks/gui/data/about.ui000066400000000000000000000435631262207653100224470ustar00rootroot00000000000000 False 5 dialog Virtualbricks (version unknown) Virtualbricks is licensed under the terms of the GPL (General Public License) Version 2. © 2014 the Virtualbricks team on Launchpad. VDE - Virtual Distributed Ethernet - © 2003-2011 Renzo Davoli. QEMU - Copyright © 2005-2011 Fabrice Bellard. QEMU is a trademark of Fabrice Bellard. Icons by Fabio Viola, Licensed under CC BY-NC-SA 3.0. See COPYING for more details. Debian package created and maintained by Francesco Namuri (franam@debian.org). If you find virtualbricks useful for your business, please consider making a donation. Virtualbricks is a GNU/Linux desktop gui for Qemu/KVM and Virtual Distributed Ethernet. https://launchpad.net/virtualbrick GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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. Virtualbricks Team: Daniele Lacamera Francesco Apollonio Simone Abbati Pierre-Louis Bonicoli Rainer Haage Fabio Viola Marco Giusti All the icons are created by Fabio Viola and released under the terms of CC BY-NC-SA v.3 (http://creativecommons.org/licenses/by-nc-sa/3.0/) Icons 'Connect' and 'Disconnect' are fairly based on 'plug' icon created by cablout (http://openclipart.org/user-detail/caboulot) (Public Domain) Icons 'Wire' and 'Wirefilter' are fairly based on 'tango network wired' icon created by warszawianka (http://openclipart.org/user-detail/warszawianka) (Public Domain) Icon 'Event' is fairly based on 'tango appointment new' icon created by warszawianka (http://openclipart.org/user-detail/warszawianka) (Public Domain) virtualbricks.png True False 2 True False end False True end 0 virtualbricks-1.0.2/virtualbricks/gui/data/attachevent.ui000066400000000000000000000257121262207653100236370ustar00rootroot00000000000000 800 430 False 5 Virtualbricks-Events to attach to the start/stop Brick Events False True dialog True False 2 True False end gtk-cancel True True True True False False 0 gtk-ok True True True True True True False False 1 False True end 0 True False 3 2 5 True False <b>Start event selection</b> True GTK_FILL True False <b>Stop event selection</b> True 1 2 GTK_FILL Assing nothing True True True 2 3 GTK_FILL 3 3 Assign nothing True True True 1 2 2 3 GTK_FILL 3 3 True True automatic automatic True True lEvents Name n True Parameters p True 1 2 True True automatic automatic True True lEvents Name n True Parameters p True 1 2 1 2 True True 1 button2 button1 virtualbricks-1.0.2/virtualbricks/gui/data/brickselection.ui000066400000000000000000000235231262207653100243270ustar00rootroot00000000000000 lBricks lBricks 800 400 False 5 Bricks to add to the event True center-always dialog True False 2 True False end gtk-cancel True True True True False False 0 gtk-ok True True True True True True False False 1 False True end 0 True False True True automatic automatic True True tmfAvl Availables {0:n} ({0:t}) True True True 0 True False gtk-add True True True True True False 0 True False ---> <--- False True 1 gtk-remove True True True True True False 2 False True 6 1 True True automatic automatic True True tmfAdd Added {0:n} ({0:t}) True True True 2 True True 1 button2 button1 virtualbricks-1.0.2/virtualbricks/gui/data/capture.png000066400000000000000000000150311262207653100231340ustar00rootroot00000000000000PNG  IHDR``w8sRGBbKGD pHYs B(xtIME)娽IDATxyx,IHHD K@ŊU\pEqRk-ݬU۪-u)BZDQQp!(hU, "J $IF&92 I˹\\f&s?9/R[Ż[3Oj] .JsZvU}Ӏ }T-j`GrD 3⻖D 0P|׏* >Whemc£%myw,|, ĖL'Yh&VL_=w$)? 8 |PBvd I>w˜) QyKr)lSbF:DEz̍X'E>#E.k\%IsJֵJ%FF*uw?NT_$(X*l^*%02X'w>+Vby<)E~\̠Qy 8F!կ>1]ߑB(d=pz1@|Rʝ!'=b,zPbh$!+#nh0Ma- XĶȊS(N 8A}hxM!F+FV;`1@WZi 5(`aW7ʼn;Hh>`) 1r E~(2'/8IIK:(x81GTߓF> \vD0gƙN>mb|g"`8&ͬb 9Qz)ZAxm81}ku`b`'hv1*s-CzYnZtcG>˜~B^xk|)c^u3sL"*s-AUBG=^tƵu^P{.NLU,Scz7# %UE={4K,1-2 . )' rb?o\Jae*hPFe>#vqp\6o̳>k6ngϞP(0GUƾ.ny$7#-9_P)0 {ł$Nk"ۄ%UXX(kc+K.Ջ-" 8Lc UJ]]˖-n:V^͎;v穲 =.UwB<)EZy* IwB32:~gK^q vB>!e6a^{͛#*))cǎ M`Cif m6~0 e`ƎHi kEu5m bh^}~+Tux LHH0zQF4NB«r\偻uYWsbߓ"99?|ᇬ]+WRWW1AqM4?Q JKVi٨ךro)5jTۑ#GEFFq$r5`Xj.eCVؓ^x0` .4Naa!BƘDŽw81}c1!!+, @H^ .lpXu c>w0=0ɉm9ُ? mk!'r5)(( 33˾|II 7Vr BGedjs ȓ:\ 2#R87>lPOfVep[m2vp\Jue5&)) 'fΜ9ɓ Bx<vMjjjI>֭[7oYnSXXȞ={ʌ1+,)tF01FYko o(,: .E"ϗs=t/#ϟOAAEEE5ƘūF* E$C*L" TR?Tf?9#E=MP1g7Nh22qm墲d^\*Ow.iijmb?&m: o$0jsLcڵkGJJ >Ajkk5wq5%*˺'+%I8L +U]kŸS^7X;W.FSz 3.Eؓ^kؑ`(—_ů_eg5?AX))*'S6.K\ʖ[\t6oRg3>dYNPpDTA&m_7 _ ;$zr@"q8m_7F`9BzE6){ͥLGw2P,kL:>.@sJٰa4i`\.ٟG ##WL? '˺IO#TnFYQ{ߦ;#OC+bK-lI 0=tPHKK3^n>l***+86OS00ntݺ>s}}xkx/x@*ރ r7=p@RRRHMM5frΝ{١Le r^))kRW!n']VCezT!߯#~`dM9"`ПpI8%)iSX|bZ0mY X=ź+o} j%^vl1C[մCuwiZ;+1lߵ{{Kួ =CG~#=z(GG#V@ݱivjb XN/zsEC;홷3T/pƘo?2Lz`2XoP~QzHV{lת&%9ZJytWR`.Sx>M4:a߳IFbRB"(& a .WLx( 𪚞8_%YQҏߙ҄Udg4lIN@]I6p+V`3Vф*_ U!.,-B.WR p"hwC)Շw4&Ӆgix:y; &d0[Qu/̓1lSσuS2?qP -p+Dq^q^ctaK̿a#GJeU֟)n^5]֒Ϗ Sipdžˇ!1;iVK8Ik[\1,G~h/-/ۛ MbX3N86ޅ% \~|eRfKKD;|~ q`gMxp2Y Br&~w҇w7vpzUpU7(o1 ?{Eu.U76qHaRaBGVS^E0& .;. u!p|b|*vK8QZ/%da :NSHg57!oˠh"}+a.( D~SE5Q6"_3ˏf=(ker7a?PEVHl/yXO) M'_|HK;#+ )5WáT/.ho/Q>VD4`/1Q2"dorA)8nLD!m>n#'@Ŋ;PG1?n<?fB1||^c;FQ-.*L' ҂ޓ6|̈́#gAml3bMcr&P惂s d`2x6e tY)啐ႈ~v2'Rϐ1dn dH1=o;ABӳ+a\6$CyI`,i.`WHr`n87 |2\Ȑ<x@hd[|ۚ{l:^9R Pt¿;\jk88u7o$͕kcv?N8( fò]p1SJwjvҺِ}8==nʸ+ᇅ'"#OLȪgVl@ԅL^z*jMӲXsb(o"tuُؾt!ऑTBk).@+ rnG ? $~)m{?cƩ RNO2TA[7 uC!9 ^a:;N jAo ?&pI-uO&>"-Iݱ[9RjlCg%0Ang7O1;ynO{(f`߱`>ynyʖb}CP:@cmF.8[wIDwq'T1 !]+]~aBl.!`bc;VI#|5~x@n c8` C_ ;S"|݉=9=O,|8Tǃf[ԃ,RL߉Vw-qx.N(%[|$eύzƞ4;;љqCR1l_T#i]@| 7b՚UYJacYaz#ة Z3[[qQ!:{FGB+4JDuGrztGWHsTGA]@Q'IENDB`virtualbricks-1.0.2/virtualbricks/gui/data/captureconfig.ui000066400000000000000000000056311262207653100241600ustar00rootroot00000000000000 True False 2 2 6 2 True False 0 Connect to: GTK_FILL GTK_FILL True False 0 Capture interface: 1 2 GTK_FILL GTK_FILL True False 1 2 GTK_FILL GTK_FILL True False liststore1 0 1 2 1 2 GTK_FILL GTK_FILL virtualbricks-1.0.2/virtualbricks/gui/data/commitdialog.ui000066400000000000000000000241241262207653100237750ustar00rootroot00000000000000 False create new empty image dialog True False True False 6 True False <b>Commit COW changes to base image</b> True False True 0 True False True Commit _COW file changes True True False True True False False True 0 Commit _Virtual Machine changes True True False True right False file_radiobutton False True 1 False True 1 True False True True False True Select A Directory True True 0 False model1 0 True True 1 False True 2 Commit changes on private COW True False True False True 3 False label False True 4 True True 6 0 True False end Commit True True True True False False 0 gtk-close True True True True True False False 1 False True end 1 True False False True 2 commit_button close_button virtualbricks-1.0.2/virtualbricks/gui/data/confirmdialog.ui000066400000000000000000000034301262207653100241370ustar00rootroot00000000000000 False 5 False True center-always dialog True warning yes-no True True False 2 True False end False True end 0 virtualbricks-1.0.2/virtualbricks/gui/data/createimagedialog.ui000066400000000000000000000340031262207653100247500ustar00rootroot00000000000000 1 100 1 1 10 300 False 5 True center-always dialog True False 2 True False end gtk-add True True True True False False 0 gtk-close True True True True False False 1 False True end 0 True False 6 True False <b>Create new empty disk image</b> True False True 6 0 True False 0 Target folder for the new image False True 1 True False select-folder Select a Directory False True 2 True False False True 3 True False 3 3 6 3 True False 0 Name: GTK_FILL GTK_FILL True False 0 Format: 1 2 GTK_FILL GTK_FILL True False 0 Size: 2 3 GTK_FILL GTK_FILL True True False False True True 1 3 GTK_FILL True False liststore1 0 0 1 3 1 2 GTK_FILL True True False False True True adjustment1 1 2 2 3 GTK_FILL True False liststore2 2 0 2 3 2 3 GTK_FILL GTK_FILL False True 4 True True 1 True False False True 6 2 button1 button2 Auto raw qcow qcow2 cow vmdk cloop Kb Mb Gb virtualbricks-1.0.2/virtualbricks/gui/data/disklibrary.ui000066400000000000000000000411131262207653100236410ustar00rootroot00000000000000 800 350 False Virtualbricks - Configure Disk Images center True True False True False 500 True True automatic True True lsImages Image name True n Path True p Used by Master Brick True m COWs Size (MB) True s True True 0 300 False 0 True False 4 True False 0 Image path: False True 0 True True False False False True True False True 1 True False False True 5 2 True False 0 Virtualbricks name: False True 3 True True False False True True False True 4 True False False True 5 5 True False 0 Short description: False True 6 True True False False True True False True 7 True False gtk-revert-to-saved True True True True False False 0 gtk-remove True True True True False False 1 gtk-save True True True True False False 2 False True end 8 True False <b>disk image</b> True True True 1 True True 0 gtk-close True True True True False False 1 virtualbricks-1.0.2/virtualbricks/gui/data/ethernetdialog.ui000066400000000000000000000250621262207653100243250ustar00rootroot00000000000000 False 5 True center dialog True False 16 True False end gtk-cancel True True True True False False 0 gtk-add True True True True False False 1 False True end 0 True False <b>New ethernet interface</b> True False True 1 True False 3 2 True True False 0 Model: True False 0 Connect to: 1 2 True False True False 0 Mac address: False True 0 Randomize True True True False False 6 end 1 2 3 True True False False True True 1 2 2 3 5 True False sock_model 0 1 2 1 2 5 True False netmodel_model 0 0 1 2 5 True True 2 button3 ok_button rtl8139 e1000 virtio-net-pci i82551 i82557b i82559er ne2k_pci pcnet ne2k_isa virtualbricks-1.0.2/virtualbricks/gui/data/event.png000066400000000000000000000267061262207653100226250ustar00rootroot00000000000000PNG  IHDR``w8sRGBbKGD pHYs d d؋tIME**?{ IDATxyyoU3=F#Bo{ٵM&m|$ vv7 qQ7! tg}i@ϧ{݇u- ˲m۶(Y B)m&Bhi! @:JC`ě΀d2I**+> |V)TLJhmMCKsh\i@B((PR"BIR۶VmN395 4- (p O.=!liO&!`Rꓠu?֥/_-:;W\"Cd$(R K)W ayG:&i6!nR &JLJymm,fnձdcXD/Hty>ƀ@|>Ād2SڝJ_ii (JJ+k $D.&D("" >w %ea4!vL7T7Z7BѣCӴsB(;SW'QHdD;e %h{"3:ccLGʑc`y !RJNWL&HR$ɥJ/ڶV}稞 bfI12S%U;ĭBtkIcm&4L``+[ !JdJn^[ B!kH+FaE(%@8͒` F#4 /?  7kzɀKhF9Uc@IPX#ۃpu:0Pt#I$ɰRo%+-mG\/兔"QE4 32#XCt4MC4Rv۶ hll%ʒeÍ蚎4eՠ%U{?O>_ !nNRCahMOY䅄1l*ML?p 32Gcc#V%/!  BB!LӢPȓr3220ǎs~-4wҲ榥蚎-9[$khB(82Ç?R=]'еrRiJ4*.(zر3 ǹ ٲe VL0%_ǖeaa2;;Î;x'x(t]9p% FūSǀRg~/I(Y #wô%`T9l&3;Ŏq9\vٟeLIJ9bsJѭtG=B4M311=|aSΦ}9~_IUPtaЙ͌ާ,s xG:~6o\)IKЖ ޯMm¹A(Gx5~ݻ]"|j]Mvf ez%r-뢱."TUp1Mt:ͽۈFYT:t~myq p C.7!uT7\^۷Lfk.eYh~?M݈pxT^08p=ojg,i[eW; 3^yקR;Dw}ooYJ'ZZ뜛&8 J)öG_8s|_fL,cfGzaz[I`Y'y{/ Y(Q%#*a~pw244HsS>?T2@y =MXx\y({Dkr -4{hRڌLe %(?%?0#/+@fAAtWc)%X /|;333<'1v4M/PA(S==00ݥq3ռuժ vڦ"ziƱx!w 6a3y߯8+Ȥ04]_-kЃ!Y%!me?_(Wq]͚o|VM^l0Buz{77ēۙuYv 2`TY!-DT*BZ .KXSX!ėc~&;3H[?!` ~+Gz#" m0ցe DvqU|HmuU- 2a~'?cוF(UcP`*)!ĺT*u4 LH$4פlr)eb&4,b#@~Z[[K^4T.ѯ~wh hGvB$؎ *,wJ 7PZ4hA|׫%4ٰ Lɧ F79 *k>F€?HDˇ?H%# lTb6BIej.#"#$4AhDNڀWYT9e,088Į=O8@4]H(ә4_@(1g]VkF_kS?}fsU|ܾg}=W\N9bs`o[scWY4[s4c_9}%8^ر<U0%,a esjoL>k )ʵXB$W` g4]љX)J!O1#/~8ie?ykVuO02>GRhbMWiAKr5,Be\TǎHpfhqy4>6|>Z:x!0οM@s9!V}}Ϡ 00p466Y泥\O~W𞧈uZp n&N hJѫOtmĺus%4M  &iB\j& R*V)JGIٻ7ESS3G*X{F:ękW#?gl. Eo;0u@I-eYf2<"UhYԧcdRjikK e{%fSOe'l, )W/O?7Ƨfѕt$%a:oP(J~@y~\!ݰ #фV.\~&,M&=%#UJF;;Om`hh,gzZyY)%>|o}}ӿrhp?hx]J}$ofI3+Xr%+/g63NVĩR4ZR2 zbg%˝7'm2 9.yϻyYy [y h]FFLdt7C,sނRl~ 4 5PdD"RuK;N*Uf5 A?3iռj_ irιos&g|oRh2 A;6reVn\q=H$š52, <$RJmM)yi9j-`txN* ~dXEc<#۶|7;ڄM*olI-Ab]뻖eqg3ĖvOUBLB\|CQ*I3`}~x$~!yk?q;+ CGݼ::CЖsZ`ϴib^w1{PC[H.):}PӃJ(kP02i69=JGG@`Q_H!7܃c ?LaZ-cSY~sx@J'w[/\Tnl(2 pF0Ab]3cLՂιrٶ/{wK2^yb`'ki(7 \xE&,պZBS+hkm%q4dS|34`e .޼[4J)]y)ENT,.B^6oތ>R?_3L^)(ׯ礓N' ֭[ B jB8_PkSf(|/dG|`huXTs\O'U4k1>>rZr9V>+0O>7p]wH)%\veSY(%bFQј3ܨm,K,;(V/$Y[r6>,~:t|>O0,*:Բ>])\J9E7%HLऔ |B|rC0eK iZN~szVĐ:&J,_`irp7S(JMڕ׻{  ӳjޘeaْt,I`+9Fb,\Q RRq/sTWHKeL)SMRRs{5@='fs9"(`fp&z!|K/;嵐t}˲o˷mR\plذL&zq1CAKs+l?@0,J;yρ$Yb~ I8òLǫP1VMkڊ(UJ駯ehhz /K/ٵk?O8S@.;R{RJtM"Wˉ SS9K #sJ8|~###9b1`07}t[ݻٽ{7@ }@XkibPYIRѱQp~e0Nqa`dBICx4h5zMl75عs'_7ηrhFgRK>i  ^V,ga2>6NUE%%m; ,Ҷ~%P4U ihhe``0K1 bߩ_|#W _<9z( 11M|>_YO| ]}}}HA<1 2mSة8*$[bolkkeUu7LJɭW_}|OO\s5B%K ̔<ATp@;v y&*ư %3bt=ΝJbj{ٿ1;n/&jřB13F#] `+E^2BGǏZ&sAx;O=t/t3xBs/j}~RiL=zlA=i Ɗ*f!^2Z* 095Rj/ Fhjj%͞0b1nFvYo+.'}zbǣ>J(&|T\a/VN0>1gT,gAsMq 5 ;/ABm1 _XuĨyD-+ؙ<!Ɗ羟Mf 4-;:~L͵̓)N8, ̝h%Y-* |ߚ'W]u]tao/vvnbjLBK/333C<GM(/J ԰0\ uO{2yzܶjDu[㏗}~ikjȶ-t;%{+Nhn,Mqʦ[d })On5-a57=;Ėkr-/ A箻.#bn :IDAT~:{_/?Rcژ@w澗-()-[EsBKi395,=iwr'.~Iؾ}G;y<T =' y1hD0䗿SƻzJ[6?%!~\DT*eONa+sGio[AG?p2 H)E6[_*ڏK=Zٰ:{e>_ R)EPI nd>2M% urL秫s;w`۶l|^ ꭔ~PJf,pZV@,KL)@ؒ9o3r5`dav楬zoo/j#+YV3E-i]Aˑ#ijXꄟKޢ\Qn6Ձ+љL`DFJ;:N9唺'd]Xkinaq`ْ5=Nz(ӹQSCm*~;kʼNy?B߇햫Kg:_wvri[tDCyWY :ֵk_(VTKkI{#JzrYC]*я?:tN 32zdNJ"-`gQ|kdYx xI`$~ ΟEbJ"x*eeܨ A CTg . M•#mБ\pvB 'M#򺓵b ܄ؑP JR<ŷsRZjdꈰJ{i\-HGY F <Ӭ_F4MY;Zf&mKH(kd /Lz`TXP ԠT*W<.T Іo?8 65.QJJ8Gy҈dsٲ~4#(-muUkg;~OG :[{eRJ#RbrRCSifMR/6iדrUG S¼)#e `p h[(wzSJI`3ieeU&)A^~en9Ru`|.kVD:>fޖN}pH&UJ j b~kNpg |H&DE \P x?u\mY6cb۶!%5.+U/p 5,58_f./D*7d ZQԏáw:!SkUWfFctbO_6_'aq%"W%b63E@[kmmmDcRwJ A``&''allӴ cQ"TѵR +۶Df(BRKZïbԗaliD B- 'p{P02 rF#-mli 5MG„1|zYGBD/c Q#S1VgyCP))~iII6u9tJO;aSP\[:[ɒUz-PeaTSa1$t:ד^HxTD"qM5Bh* XUz<ǻxܥTck+bˎU-|B2S3GE0Wgg4!jB~=H[rċ%t| ~.(͍2–&JR^|!w5L~Z)uR3Lsgp)B{*RI.ܒE[ð@ mWވMl3LF˔W*.q"& 5 /-9OEuB&'ARw6l[Z3fDޘ`hܩt:fEIjCX)ւ pi蚟HQ"-"nBXtِJ*/Zr)%I7f,|W;JNtP6~:'NdD0j$n&S\IJ92JIwqfeQ03d SB>@'ź7j`PM+OQJ6*:geRs3"W6eCB߁xAҩTZi Tz WSkC@ȤBB_CG(; IENDB`virtualbricks-1.0.2/virtualbricks/gui/data/eventcommand.ui000066400000000000000000000125261262207653100240100ustar00rootroot00000000000000 False 5 dialog True False 6 True False end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False True end 0 True False 0 Enter command (each line is an action) False True 1 True True actions_liststore False 0 True Action True 0 True Host shell command 1 True True 2 cancel_button ok_button virtualbricks-1.0.2/virtualbricks/gui/data/eventconfig.ui000066400000000000000000000102441262207653100236320ustar00rootroot00000000000000 True False 6 True False True False 6 Delay (seconds): False True 0 True True True False False True True False True 1 False True 0 True True actions_liststore False 0 True Action True 0 True Host shell command 1 True True 1 virtualbricks-1.0.2/virtualbricks/gui/data/exportproject.ui000066400000000000000000000233121262207653100242330ustar00rootroot00000000000000 400 300 False 2 Export project dialog True False 2 True False Choose the files to include in the project False True 3 0 True True automatic automatic True True treestore1 False Name 1 0 2 3 Size True True 1 True False end gtk-cancel True True True True False False 0 Export True False True True image1 False False 1 False True end 2 True False 6 True False File: False True 0 True True False False True True True True 1 gtk-open True True True True False True 2 False True 3 Include base disk images (slow) True True False True False True 4 cancel_button export_button True False gtk-ok virtualbricks-1.0.2/virtualbricks/gui/data/help/000077500000000000000000000000001262207653100217135ustar00rootroot00000000000000virtualbricks-1.0.2/virtualbricks/gui/data/help/bandwidth.txt000066400000000000000000000001111262207653100244110ustar00rootroot00000000000000Channel bandwidth ================= The buffer is drained at this rate. virtualbricks-1.0.2/virtualbricks/gui/data/help/chanbufsize.txt000066400000000000000000000001131262207653100247500ustar00rootroot00000000000000Channel buffer size =================== Maximum size of the packet queue. virtualbricks-1.0.2/virtualbricks/gui/data/help/delay.txt000066400000000000000000000001211262207653100235440ustar00rootroot00000000000000Delay ===== Propagation delay. This delay is added to the buffer queuing delay. virtualbricks-1.0.2/virtualbricks/gui/data/help/loss.txt000066400000000000000000000002261262207653100234340ustar00rootroot00000000000000Packet loss rate ================ The packet loss rate is sent in % as a floating point number. Example: PLR=0.1 means one packet loss every 1000. virtualbricks-1.0.2/virtualbricks/gui/data/importdialog.ui000066400000000000000000000520121262207653100240140ustar00rootroot00000000000000 450 400 False 12 Virtualbricks - Import project False True center True False 5 2 6 3 True False 0 Project name: 1 2 GTK_FILL GTK_FILL True False 0 File: GTK_FILL GTK_FILL True True True False False True True 1 2 1 2 GTK_FILL GTK_FILL True False 1 2 GTK_FILL Open after import True True False True 2 2 3 GTK_FILL GTK_FILL Overwrite existing project True False True 2 3 4 GTK_FILL GTK_FILL False A project with such name already exists. 2 4 5 GTK_FILL GTK_FILL intro Import project True True automatic automatic True True liststore1 False 0 both Save 2 Image name 0 Image path Save images True True True automatic automatic True True liststore2 False 0 both Image name 0 Image path Remap images True False True False 5 True False 0 Project name: False True 0 True False 0 testproject False True 1 False True 3 0 True False 4 True False 0 Project path: False True 0 True False 0 /home/bob/.virtualbricks/testproject True char middle True True 1 False True 3 1 True False 5 True False 0 Open: False True 0 True False 0 False True True 1 False True 3 2 True False 5 True False 0 existsing project overwritten: False True 0 True False 0 False True True 1 False True 3 3 True False 0 0 Images imported: False True 3 4 True False 0 debian 7 ubuntu 12.04 False True 3 5 True False 0 Images mapped: False True 3 6 True False True True 7 confirm Import project True True False gtk-add virtualbricks-1.0.2/virtualbricks/gui/data/listprojects.ui000066400000000000000000000117661262207653100240620ustar00rootroot00000000000000 300 300 False 5 True dialog True False 2 True False end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False True end 0 True False 6 Select project False True 1 True True automatic automatic True True liststore1 False 0 column 0 True True 2 button2 button1 virtualbricks-1.0.2/virtualbricks/gui/data/loadimagedialog.ui000066400000000000000000000154351262207653100244340ustar00rootroot00000000000000 300 200 False 5 dialog True False 2 True False end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False True end 0 True False <b>disk image</b> True False True 1 True False 3 2 6 2 True True False False True True 1 2 GTK_FILL True False 0 Name GTK_FILL GTK_FILL True False 0 Description 2 1 2 GTK_FILL GTK_FILL True True automatic automatic True True 2 2 3 True True 2 button2 button1 virtualbricks-1.0.2/virtualbricks/gui/data/logging.ui000066400000000000000000000136311262207653100227540ustar00rootroot00000000000000 500 300 False Virtualbrics logging center-on-parent True True False True True automatic automatic True True False word 5 5 False True True 0 True False False True 1 True False 5 5 end report bug True True True True none mailto:new@bugs.launchpad.net False False 0 True gtk-save True True True True False False 1 gtk-clear True True True True False False 2 gtk-close True True True True False False 3 False True 2 virtualbricks-1.0.2/virtualbricks/gui/data/netemu.png000077700000000000000000000000001262207653100256432wirefilter.pngustar00rootroot00000000000000virtualbricks-1.0.2/virtualbricks/gui/data/netemuconfig.ui000066400000000000000000000673741262207653100240260ustar00rootroot00000000000000 1073741824 75000 1000 10000 1073741824 75000 1000 10000 1073741824 10 100 1073741824 10 100 100 1 10 100 1 10 1073741824 125000 5000 25000 1073741824 125000 5000 25000 True False 9 5 5 True False Maximum size of the packet queue. Exceeding packets are discarded. 0 buffer lenght (Byte; 0=no limit) 3 4 GTK_FILL GTK_FILL True False Extra delay (in milliseconds). This delay is added to the real communication delay. Packets are temporarily stored and resent after the delay. 0 propagation delay (one way; ms) 4 5 GTK_FILL GTK_FILL True False Percentage of loss as a floating point number. 0 loss rate (in %, [0,100] real) 5 6 GTK_FILL GTK_FILL True False Sender is not prevented from sending packets, delivery is delayed to limit the bandwidth to the desired value (like a bottleneck along the path). 0 bandwidth (Byte/s; 0=no limit) 6 7 GTK_FILL GTK_FILL True False Asymmetric 3 4 2 3 GTK_FILL GTK_FILL True False 0 True True False False True 3 4 3 4 GTK_FILL GTK_FILL True False 0 True True False False True 3 4 4 5 GTK_FILL GTK_FILL True False 0 True True False False True 3 4 5 6 GTK_FILL GTK_FILL True False 0 True True False False True 3 4 6 7 GTK_FILL GTK_FILL True False 5 True False Forward link False False 0 True False 0 True True 1 1 2 2 3 GTK_FILL GTK_FILL True False True False 1 left none True True 0 True False 0 Reverse link False False 1 2 3 2 3 GTK_FILL GTK_FILL True True True False False True True adjustment1 True 1 2 3 4 GTK_FILL True False True True False False True True adjustment2 True 2 3 3 4 GTK_FILL True True True False False True True adjustment3 True 1 2 4 5 GTK_FILL True False True True False False True True adjustment4 True 2 3 4 5 GTK_FILL True True True False False True True adjustment5 2 True 1 2 5 6 GTK_FILL True False True True False False True True adjustment6 True 2 3 5 6 GTK_FILL True True True False False True True adjustment7 True 1 2 6 7 GTK_FILL True False True True False False True True adjustment8 True 2 3 6 7 GTK_FILL gtk-help True True True True False 4 5 3 4 GTK_FILL GTK_FILL gtk-help True True True True False 4 5 4 5 GTK_FILL GTK_FILL gtk-help True True True True False 4 5 5 6 GTK_FILL GTK_FILL gtk-help True True True True False 4 5 6 7 GTK_FILL GTK_FILL True False 5 7 8 GTK_FILL 5 True False end gtk-revert-to-saved True True True True False False False 0 5 8 9 GTK_FILL GTK_FILL True False 5 1 2 GTK_FILL 5 True False 6 True False True True 0 True False <=== connect ===> False True 1 True False True True 2 5 GTK_FILL virtualbricks-1.0.2/virtualbricks/gui/data/networkcards.ui000066400000000000000000000050501262207653100240300ustar00rootroot00000000000000 False True True liststore1 Eth True 0 Connection True 1 Model True 2 MAC address True 3 virtualbricks-1.0.2/virtualbricks/gui/data/newbrick.ui000066400000000000000000000436131262207653100231350ustar00rootroot00000000000000 True False router.png True False switch.png True False wire.png True False netemu.png True False tap.png True False switchwrapper.png True False tunnelconnect.png True False qemu.png True False tunnellisten.png True False capture.png False 5 True True dialog True False 2 True False end gtk-cancel True True True True False False 0 gtk-ok True True True True True True False False 1 False True end 0 True False True False center Switch True True False image1 top False False False 0 Wire True True False image2 top True False rbSwitch False False 1 Netemu True True False image3 top False rbSwitch False False 2 Tap True True False image4 top False rbSwitch False False 3 Switch Wrapper True True False image5 top False rbSwitch False False 4 True True 0 True False center Tunnel Client True True False image6 top False rbSwitch False False 0 Virtual Machine True True False image7 top False rbSwitch False False 1 Tunnel Server True True False image8 top False rbSwitch False False 2 Capture Interface True True False image9 top False rbSwitch False False 3 Router True True False image10 top False rbSwitch False False 4 True True 1 True True 1 True False True False Brick name: False True 0 True True True True False False True True True True 1 False True 5 2 button2 button1 virtualbricks-1.0.2/virtualbricks/gui/data/newevent.ui000066400000000000000000000326461262207653100231700ustar00rootroot00000000000000 True False event.png True False event.png True False event.png True False event.png True False event.png False 5 False True center-always dialog True False 2 True False end gtk-cancel True True True True False False 0 True gtk-ok True True True True True True False False 1 False True end 0 True False True True False True Brick start True True False image1 top True True True False 0 Brick stop True True False image2 top True start_button True False 1 Brick config True False True False image3 top True start_button True False 2 True True 0 True False True Free shell command True True False image4 top True start_button True False 0 Events collation True True False image5 top True start_button True False 1 True True 1 True True 1 True False 2 2 6 True False 0 Event name: GTK_FILL True False 0 Delay: 1 2 GTK_FILL True True False False True True 1 2 True True 10 False False True True 1 2 1 2 True True 2 cancel_button ok_button virtualbricks-1.0.2/virtualbricks/gui/data/qemu.png000066400000000000000000000032521262207653100224420ustar00rootroot00000000000000PNG  IHDR``w8sRGBbKGD pHYs>tIME* :*IDATxKoUyy;MyTMiSJ.*lETV |#6HR] "D(*PJ+Nb{3f1SnSD8S{ss>MTE$ aKBɨ"| "f j )shrIGHhp,II^̜9sBW'Cv^{N)% l×T_/?+%e&ScǮ]aMvv\ET/ȕj;`U5.k6$ n`nƇt!_rQxhCSSJ#lSmpEE~N5UI]Qx|=`*,SET]Z:j;`u%bD?tPqCgTuiw@ͮj^@]T=zG.]ׯ,}9@~aU >lԠb}9 W_‚(Y(%rVpO=IB.MUQ\ T5R)ؖ\Jk1Ri5  *|gsdna | ϸ;v{~;snlגig>ܸe3A}@_20=uqouX^8gxl=UUu" A@Z@Qt٧5ʧ_ܪ{@5 D.AF\=KVgff>珯Б9tÿ֎~"6Z'eJu69j33543aIm&+sBɯժnZu+ŊRy:{ޥ%gSFyd$qtXf2#nk[(= 1JOէ2[.] ;cᄑղ6ը3Әp(022l)z`hm y|S/\q>+WF[HAps9ض0vAyBX31`pp{}ǎmǡT_ /{'!!kdgt~`vv g+gTU6:6q1+iYD*aYmk +&BRT,yB-r_Xf3Ly70aaaaaaaaaaaaaaaaaaaaafm/|-oIENDB`virtualbricks-1.0.2/virtualbricks/gui/data/qemuconfig.ui000066400000000000000000004120161262207653100234630ustar00rootroot00000000000000 1 64 1 1 8 500 1 1 10 1 99999 128 1 10 99999 1 1 10 1 65535 1234 1 10 value value True False True True True False 2 5 5 True False True False 0 True False True False 3 True False 6 True False 0 boot as device False True 0 150 True False lBoot 0 label True True 1 False True 0 Snapshot mode True True False True write to temporary files instead of disk image files True True False True 1 True False <b>boot options</b> True False False 0 True False 0 True False 6 6 3 6 True False 3 2 6 3 use image as cdrom True True False True use one of the image files in the default folder as cdrom device True True nocdrom_radiobutton 2 3 GTK_FILL GTK_FILL mount cdrom True True False True mount local cdrom Drive True True nocdrom_radiobutton 1 2 GTK_FILL GTK_FILL no cdrom True True False True don´t use any cdrom device none True True True GTK_FILL GTK_FILL 180 True False lDevice 0 label 1 2 1 2 GTK_FILL GTK_FILL True False gtk-cdrom 1 2 GTK_FILL GTK_FILL True False 1 2 2 3 True False <b>cdrom device</b> True False False 1 GTK_FILL GTK_FILL True False True False 0 True False 5 6 6 6 True False True False True False gtk-harddisk 3 True True 0 True False 0 Select images for Qemu volumes True True 1 False False 0 Use virtio block devices True True False True True True 1 True False 7 3 2 2 True False 0 fdb: 5 6 GTK_FILL True False 0 fda: 4 5 GTK_FILL True False 0 hdd: 3 4 GTK_FILL True False 0 hdc: 2 3 GTK_FILL True False 0 hdb: 1 2 GTK_FILL True False 0 hda: GTK_FILL True False mtdblock: 6 7 GTK_FILL True False lImages 0 True n 1 2 6 7 Private COW True True False True 2 3 GTK_FILL Private COW True True False True 2 3 1 2 GTK_FILL Private COW True True False True 2 3 2 3 GTK_FILL Private COW True True False True 2 3 3 4 GTK_FILL Private COW True True False True 2 3 4 5 GTK_FILL Private COW True True False True 2 3 5 6 GTK_FILL Private COW True True False True 2 3 6 7 GTK_FILL True False lImages 0 True n 1 2 True False lImages 0 True n 1 2 1 2 True False lImages 0 True n 1 2 2 3 True False lImages 0 True n 1 2 3 4 True False lImages 0 True n 1 2 4 5 True False lImages 0 True n 1 2 5 6 False False 2 True False <b>additional media</b> True False True 0 True False 0 True False 6 6 6 6 True False 5 center New image from file True True True False False 0 Configure disk images True True True False False 1 New (empty) disk image True True True False False 2 True False <b>disk images</b> True False True 1 1 2 GTK_FILL True False True False gtk-floppy True True 0 True False Drives True True 1 False True False 6 True False 6 True False 0 True False 3 3 True False 3 3 True False True False 0 Architecture: True False False 0 True False 1 gtk-convert True True 1 False False 0 True False lArgv0 label True True 1 True False 0 CPU Type: True False False 2 True False lCpu label False False 3 True False 0 Machine type: True False False 4 True False lMachine label False False 5 True False KVM True True False True False False 0 True False 1 3 Number of CPUs: True True 2 1 True True 2 True False False True True adjustment1 True if-valid False False 2 False False 6 True False <b>System and machine</b> True False True 0 True False 0 True False 3 3 3 4 True False 3 3 True False True False Emulated Soundcard: False False 0 True False gnome-stock-volume True True 1 False False 0 220 True False lSound 0 label False False 1 True False <b>Audio Device Settings</b> True False True 1 True False 0 True False 3 6 3 3 True False 3 True False 3 True False 0 Used RAM: False True 3 0 True True True False False True True adjustment3 1 True False True 1 True False MB False True 2 True True 0 True False 3 KVM Shadow Memory: True True False True False False 0 True True True False False True True adjustment4 1 True False True 1 True False MB True True 2 True True 1 True False <b>Memory Settings</b> True False True 2 False True 0 True False 6 True False 0 True False 6 6 3 6 True False True False disable graphical output True True False True True True True 0 True False gtk-fullscreen False False 1 True True 0 Use VGA instead of Default True True False True True False False 1 True False Start in vncserver True True False True True False False 0 True False on Display: False False 1 True True True False False True True adjustment2 1 True False True 2 True True 2 SDL True True False True True True 3 Portrait True True False True True True 4 True False <b>Display Options</b> True False True 0 True False 0 True False 6 6 3 6 True False 6 enable usb True True False True True True True 0 Bind devices True True True False True 1 True False gtk-preferences False True 2 True False <b>USB settings</b> True False True 1 True False 0 True False 6 6 3 6 True False 3 Set realtime clock to local time True True False True True False True 0 Guest time drift compensation (TDF) True True False True False True 1 True False 6 True False Keyboard: False False 0 True True 5 True False False True True True True 1 False True 2 Serial True True False True False True 3 True False <b>Extra Settings</b> True False True 2 False True 1 1 True False True False gtk-execute True True 0 True False System True True 1 1 False True False True False 0 <b>Network cards</b> True False True 0 True True automatic automatic True True plugsmodel Nic True True 0 Connection True True 1 Model True True 2 MAC address True True 3 True True 1 True True True True Set up a new network card True False 0 0 0 True False 2 True False gtk-add False False 0 True False Add Network card True False False 1 False True end 2 2 True False True False gtk-network True True 0 True False Network True True 1 2 False True False 0 True False 6 6 3 6 True False 4 2 6 2 Use a custom kernel True True False True GTK_FILL GTK_FILL Specify initial ramdisk True True False True 1 2 GTK_FILL GTK_FILL True True True False False True True 1 2 2 3 GTK_FILL GTK_FILL True False 0.10000000149011612 Parameters to append to command line: 2 3 GTK_FILL GTK_FILL Enable kernel debugging True True False 1 True 3 4 GTK_FILL GTK_FILL True False 6 True False 0 GNU debugger TCP port: False True 0 True True True False False True True adjustment5 True True 1 1 2 3 4 GTK_FILL GTK_FILL 200 True False 1 2 GTK_FILL GTK_FILL 200 True False 1 2 1 2 GTK_FILL GTK_FILL True False <b>Booting Linux</b> True 3 True False True False gtk-properties True True 0 True False Customize Linux Boot True True 1 3 False False 0 True False 6 6 6 6 True False 2 6 True False 2 200 True False True True 0 True True True True False gtk-delete 2 False False 1 GTK_FILL GTK_FILL True False 0 gtk-missing-image 1 2 GTK_FILL GTK_FILL True False <b>Virtual Machine Icon</b> True 4 False True False gtk-edit True True 0 True False Others True True 1 4 False True True 0 value value value value virtualbricks-1.0.2/virtualbricks/gui/data/renamedialog.ui000066400000000000000000000115351262207653100237560ustar00rootroot00000000000000 False 5 Virtualbricks - Rename brick True center-on-parent dialog True False 2 True False end gtk-cancel True True False True False False 0 gtk-ok True False True True True True True False False 1 False True end 0 True False 3 True False Choose a new name: False False 0 True True True False False True True True True 1 False False 1 cancel_button ok_button virtualbricks-1.0.2/virtualbricks/gui/data/router.png000066400000000000000000000126451262207653100230210ustar00rootroot00000000000000PNG  IHDR``w8sRGBbKGD pHYs&tIME%'%IDATxyW}?{=Z$Ke ccD@&pl ƤRH** PE !`F&(&XWYaKsٝߛ{F0z53ݯ~E"tk>5=@RZ q`Zkb40cZ{ 8^F_+&"5K+:  * !`PNCn:dP,UnZqFk Gh oH":wە.Yݍ`@ҮfbNjml 7*!x6%qf`a;&0>zJŰ`0Xi'%=Un?pAO7#   ĄD)2ZSƞhC<KO*Z ]k Xz{ͅmaT8' ;4ZgQ_Q^SD"x]^jjJX`fM3+Mp8ǎ?%wGQ~zDv(CZsmׯGm,L:پ.BW_Bl?wÇqK)^֚2{ED Z3w&  yƆHg!;))$<`)Ŕ< <ze aRlĽի!֑ d'p(<(R5FYD><w`m >v_+rSDn\ Y>2}D"DYf #=z)ւϺ~z,dY 3Rh̓(ы {{qozӛĮS߬#pdT vGnoYx̤2GD2#sp8ك;=|&koa_ c…RsKwSC0;&axl?zaa x߈=JX'Aj_'vi4 qS/r%CBxL_: = opر޳k<9~tv-PrYH\x} 2(D"Z @MB3'!ms3Uxe+ :Ɉ_ϑ灗:A'`:=mn =4TpO~;}7Aa~Qkgr#ܻ G3⬿qN`i,2?Gx~r9[އ. $8! Y DXG-"s' @見? g㶦m\8'O//3Y ..ݗsyظN԰|څp֬F9YSJqΝ -7K3AT6 95 ?wއBt4\_|vǢK $$OJu.FyH۸oTBpSTvI4ŝ#{oH·Y9_a踌)s^{| )`+k,}P7V|ЋؾAxrg'q0sI$O@r5T3ZӚ7m,;lQ xKFq `m]?h7FA/,}:~eC`Pش ?F` 8(,h7Gv!'Ot|dbd.):>` HW`p(ر ,%UJeR.Q~>xa$wWOvvb]AiWxGVt!g,uK)_-b5|}v ē tք,@IT?sMyr&p"ۿ#p&/>?ݬg/?=jmJ`<<*fM4tH? <{j[- 5CLsc!=d") PH,%oSSsdl7|g-qUIx `F%e'i4+KCEpҹ̮ߧxFQ vnpRCp`YMEeH0{ 2b6hylQJ῏Ju'.[Q9+.d v3ǎ5s_Y/NM ӟ8ڔe޻^ˢ߮ |lܻn'^)?9,?>+.K1=ژcDŽ!Dc/]*wBW_d&k~,On$R_V7G7ĺQǭ>߬+i/6K%OEg-8{V*K@AolV\XX[GHAu<ڼU"o[~e ꎌJ5ӇRHͅə1Ȏ/B<)fU x[? rz{jt,hN[WU'2DAjI_x~QA@/Nϋ&twCv\ T)ɖebS߽ک脇.fta1O95,̜#_9c qtnj /ʍIIE&U'_k6|Vi/]dp{pX_/3q/0?wAyP v8belΜ%D}}r3nB&83 j)%w>_\Ƴe&hѹw~MBM:%sǘOJi2)>Z:,@\̈7ͯ=h93YG;uE3M2fk?=-q$t.S:\( 6l%;+'|9Yf |3J.[&\hf,MJ.'Uѯ&9o5tY~bU,baR;ٸ:{aooh4$8 s04aJla9 '{/'w22|9tHYdwMN՞U&pl0p1R+}DKA"-Y7,Zd3Q;E+kݘf+X ^]וys*el0\(j?N%aiVhG"'V,S Iԅ$.֬YY+KH![e!a%kXrJxz5@*Uc zUT/$ɌT &$=8((%!.E<2 |\~Dfavڬ/R5ab1fıv.Z<*9y yW) #o@،Hѣ5-XP#yPHUSl3WN;Th}\A1 ((2|l8gkc:ԫb2/¢PqA>됆*jfN瓜Sw,|u2hd<.mfF>gg W8^q`mW3<*LWZ>@4m:'d tPJ@N7.qJ쬴{Ub> )>65uy@ٮ?I}dmýQ#U%<9YkMK 5-&bHY>[> Jf?(#0UY7jPGN!u>`_6lX:z͍THZ6/CkJ^P w~[:&r l s>H5WsM9jySmU4k^P2pڅԄ> ؛@F=9!NddWה,T8Zv1Kվx[%V:})Ň}k!KuXUtu鍗tjrpi_WP޸z}By&P&ΉV4#UUۤUUeTPaTypKDC4_UsŚCCO8L"=SS *+NX$Iחvz׭x3^]/^g,ɓy4sղCC<3ѕJI_£8j&K]SVVr^2q9 1vd\Q(qCC < lD+ u]g}@ 0 o!3 Q, $Sfuyh dxˬ;C2 8:.$4Qx pCͿ'.q%$%?W TE %oɲp ʶMZ@fkEm;FoQjf#g~őwM# n#֦6MmjSԦ6MmjSԦ6MmjSԦ6MmjSԦ6?1?IENDB`virtualbricks-1.0.2/virtualbricks/gui/data/saveas.ui000066400000000000000000000156671262207653100226230ustar00rootroot00000000000000 False 5 True 350 300 dialog True False 2 True False end gtk-cancel True True True True False False 0 gtk-ok True False True True True False False 1 False True end 0 True False 0 Existing projects: False True 1 True True automatic automatic True True liststore1 False False 0 column 0 True True 2 True False 6 True False New project name: False True 0 True True True False False True True True True 1 False True 3 cancel_button ok_button virtualbricks-1.0.2/virtualbricks/gui/data/settings.ui000066400000000000000000001046251262207653100231720ustar00rootroot00000000000000 600 460 False Virtualbricks Settings False True True dialog True False True True True False 0 none True False 4 2 True False 0 X-window terminal command: GTK_FILL GTK_FILL True False 0 X-window sudo command: 1 2 GTK_FILL GTK_FILL True True True your favorite x-terminal-emulator True False False True True 1 2 GTK_FILL True True True command to perform administrative actions on your system True False False True True 1 2 1 2 GTK_FILL Enable SysTray True True False True 2 2 3 GTK_FILL Warn about Missing Components at Startup True True False True 2 3 4 GTK_FILL True False <b>General</b> True True False General False True False 0 none True False 5 2 True False 1 Binaries path: GTK_FILL GTK_FILL True False True Path for vde components installed on the system select-folder True Select A Folder 1 2 GTK_FILL True False 1 0.20000000298023224 Status: 1 2 GTK_FILL GTK_FILL True False 0 in True False 9 <span color="red">Error:</span> invalid path for vde binaries True center 1 2 1 2 GTK_FILL Use python support True True False True 2 2 3 GTK_FILL Allow female plugs on devices True True False True 2 3 4 GTK_FILL Network topology loop detection True True False True 2 4 5 GTK_FILL True False <b>Vde options</b> True 1 True False Vde 1 False True False True False 0 none True False 4 2 True False 1 Qemu/KVM binaries path: GTK_FILL GTK_FILL True False True Path for qemu and kvm binaries select-folder True Select A Folder 1 2 GTK_FILL True False 1 Status: 1 2 GTK_FILL GTK_FILL True False 0 in True False 9 <span color="red">Error:</span> invalid path for qemu/kvm binaries True center 1 2 1 2 GTK_FILL True False 0 Disk images repository 2 3 GTK_FILL GTK_FILL True False select-folder True Select A Folder 1 2 2 3 GTK_FILL True False 0 Private COW format 3 4 GTK_FILL GTK_FILL True False lFormats 1 2 3 4 GTK_FILL True False <b>Qemu/KVM </b> True False True 0 True False False True 1 True False 0 none True False Use KVM True True False True True True 0 Enable KSM True True False True True True 1 Use kqemu True True False True True True 2 True False <b>X86 optimizations</b> True False True 2 2 True False Qemu/KVM 2 False True True 0 True False end gtk-apply True True True False True False False 1 gtk-cancel True True True False True False False 2 gtk-ok True True True False True False False 3 False True end 0 applybutton1 cancelbutton1 okbutton1 virtualbricks-1.0.2/virtualbricks/gui/data/simpleentry.ui000066400000000000000000000075311262207653100237030ustar00rootroot00000000000000 False 5 dialog True False 12 True False end gtk-cancel True True True True False False 0 gtk-ok True True True True False False 1 False True end 0 True False Project name False True 1 True True False False True True False True 2 button2 button1 virtualbricks-1.0.2/virtualbricks/gui/data/switch.png000066400000000000000000000041131262207653100227710ustar00rootroot00000000000000PNG  IHDR``w8sRGBbKGD pHYs(vtIME%0J}IDATxkl0bB$SJyȍIh+6MIS5(*U5*hRHUHUR(Plvl3ìjmwNOݙ3?U|T).Yqy|\ey}c6n޸Ldg<['3oew>8 /)ÿPYICK~(;5_{0F3y0n91 z_އ`\ZZj x J`6mbθlx ܜiFw_@b^ߜfyitC7B{Ix֯'5)׀/eȹbMh'/yoª&,xG;ekZ ŵ3v xٵ }/jH]-+ׁ֑쁒lP Eu |&ulϐ Fm3> =ex!3&'Gw}nՃNB8G YuY򫨯oI{X9b\I$ ۖCr9zr5:9 ,tui `}N;. e.ws> 5~pr1r-W }b|v@1k8syȎVS5 >`&tvc`g4twau~PSޏahSaToxc@1.fOCi]bQ:(j%('oVkfی/kAYKxLx!.UM\pX P':΀M>\]:u5;P7 p4HqaMj6Rhc,S؂T!c3t @~>3R<ܼm0wA tlǡ5&M!-ڼ*#^ZlO|\~l .-gNb.jHzp[hu,YP`Ic/&Nfܳ/I=Ppnx.dCU>Gfa|ō497C:HpiRP 3m3`F6׳۟ļ\ah z7fCFڊaqY2Lw5/7xoySwnD)On4>T(E NԀ<Ûؼm`1Q"o7NK^#E7bP`txxrr>N&m؊oo vj/R^Nj3n9E)S(OXiPz@&eNaZh f;;nTF/[5;~`\Ԏ6#P;p5IQ8hLJ(yJq\cx'Ni"4.8zڑ 6(.աxAjOnpRR] Po JJpNcxclv>=/FO盛ÇiL=$hoLM ZkN.; <|Yc{JTWCq1Nw7]ɼw#}_?@ݱX]X`hn}c\QQ,Z                     9_as!q'IENDB`virtualbricks-1.0.2/virtualbricks/gui/data/switchconfig.ui000066400000000000000000000065631262207653100240230ustar00rootroot00000000000000 1 128 32 1 32 True False 2 3 6 2 True False Number of ports: 2 True True True False False True True adjustment1 1 2 2 Use FSTP True True False True 2 3 GTK_FILL GTK_FILL Hub mode True True False True 2 3 1 2 GTK_FILL GTK_FILL virtualbricks-1.0.2/virtualbricks/gui/data/switchwrapper.png000066400000000000000000000124131262207653100243740ustar00rootroot00000000000000PNG  IHDR``w8sBIT|d pHYsN#KtEXtSoftwarewww.inkscape.org<IDATxyTձǿ3,@D$j\q1((DP@M*5C\0F4DpAQT 63vQK33ܙӟ{NsZU*""@`:9iRB#@U="t'QT,.>ګjqsDd`#ULRUMƼ}@t9:uݮx>Ue,vu=} GY;cT>|7<ЙG&7,nIIx_k_9N}`Xy#/\>68F\c9p4Iw0 +\6WI`cuͯ Pc~`6p|J;]2^\s)s@`wuH~*_p+maltQ*ZUw '4^bz8=L4O% lΓ@8XxǦ@}Gi9:c|π{ݐ.ǐDйZ%v)Q6>~ߙ6nW0vQ`q:u},luk@Rm3nF]y}|t@&G|ۿuq :]f|p 6P*<$AoM`qҩpy祛О6ۉ3̰xM8/HD)/SO nxԌ#%nz>#rZCJ2 _GgiK}o|·XVFZӨ%p+P8N$OV\a(h\GgpfV3z EE|+>8:kMEb,XFd87@t> Wr.3~Ac3E< o_h"Icv3ja<| *Lu#?I*@#I46՘ A"?Ny7Ǹ:zgWo|g8x/qN(؀SEdKOut$8\U= Ue0>!ʾ*!0G)3"~[@oߛh쌒{Ԍx"3(m N `Ϩ,}emhK{yBMgE(ﱺk{淺g7ap{J7C|RpopL??YK]0vIU\H)Sz.TusC>Kuіjg T2_U 6a):b$7la|'ӁU}"JDhUNh(6+7OIM JnNOdg'Y-)4=ڋYT-q,,fDȋ3_=^n OۆFVN~vǩky-Lzck U=;nbS"R-0 ת/E,`N> T4e-5#Me'ZXZ%!ݞj}.Jp(S"r4vXa5E*~_FC!yISOOR /]!P+WJwq?D"r&Y_Bv`yE6v70_UMp(fz5'wQS/fo;T]R*"\1TG9AEvV5IU@d40;qD$$;pkeI|nlG|UFjIeᘮ"8JUE3)N0xlvV2*}{("~4oR{_@cf"rA0[UE=?HO /VT-( a̬m;y3ti"'57wWOȷJ|zS^Dnc]@7'\ )-nعMjNyRV*pa,\ǭv) #UW!ljT0W0ĦzKiwBz:}l6hΙ0B_lWxd4X'V@c6uTUuf{~Oʜq#{`Z.迌>Yiʵ>AOr[>-c`Ix<*9 fzG3;J#"0F+aX] gilA~|vn}z{S%  "[`'Ga&ʄ- 3M(̫ܺoNn2y0d{y7 &\s%07`潣TjL0%Tв),Yܻt|],}f3-*n`[^Ṅ "E!̓l:v=H1A7L^~ޘZ5wsJ._3;4bL9V^FD`U]_Z>UDD yɘ.+ -ޟ='۠a>!j=sܒ櫴NNKlv-x6o1Gx〾Dnj+?yzP60@ڍ_kAmrB!{Wx{%/-nф@ pt.LA `nz|Tu;UDI3N:ޘ/au54CחCuԀd/""r#2] f<P"lIS1}R=욻YMi 2ᜏ_nm%)_TJץ^u:1 JUPՅaT3bz ُ`=VU R"7vK/"ʯYcRme%H9OU':=:(['I{Vʑꨉ1U"TDv~⺥)BTz,X`wTSYt!pn+0F3[ buU*˃UB^a>>-UuuYf`8jb J)9g}WQ5/.Yt D _GTGJ]k?X&TYϣp+P|lOt#/q[DE1z3{>)`= USձW\{^&A^* ]{k=Uy.H\_Uݪ]vgK;ǟ̚be=(kUuXQy_r_9cy{mn$0nqw(ަc`bY 8\OʎEw1^*R fÜKKP%%pEd 4UnG[3ȝUH2UBwb.Ͱ6e] #= ƨ]yCQS* ;`A=V-#ӈHu D-UΪ:S WSJֈ.JLsKi臟4w׽ba1OB$L1w1\&"c1~UWT|Thه q  1 ?X7N{n)xcQ7n5\J P.EU׋x,+X<+#0ŧPկ`Q8-/M2{ks >mcf3þ<~zzm/T71`S{}a,:0]T#)U~Կ <+b`>LI49]D`=%MsUuQ<̇C\H True False 2 6 True False 0 Path to switch: GTK_FILL GTK_FILL True True True False False True True 1 2 GTK_FILL virtualbricks-1.0.2/virtualbricks/gui/data/tap.png000066400000000000000000000105521262207653100222600ustar00rootroot00000000000000PNG  IHDR``w8sRGBbKGD pHYsh/tIME$0bޯ{IDATxyt?]CHInHd n"Zi9jzTOLU=N=guZZPh HٗWn~06 3#NNNMbYnX|7nVkH gV̝;w<.**"''G (0=%''rj6ـ Oabb⎻;s+++Vu7RN֦GZ[[C*Jc6nf02Y,^zIi0xp Sze&|'Q*E"^J8~). 5d0"pnVW_U _ \.v%F?>ѱpp} Gꫯ4ͤnpa2221755hi꠻;200v{-~ ؐTKIIId޼y Zhlljf YUBttt_|ijjj(JjF M2@u:]evvvf-ZDQQQdܹ'LQT'jxJJ 17vtS{d/ FNNi޼y3CAoo Wn0K `eBBŠF~~>PP,--c.룦}~pqImXd ,XD,VUU MMMv2;.vD iUv% QwD!*#VШ@+؊twAII &!A8%nq޽Bss3і2vy _$m| U)Nx1L1'l߶3rP0Ğl6cUUU?… 'yg'b1|hX(嬾ŗv+5;b4F44c0p;]]ވZAnzŗk{ss3YYY.(B!BCCC}ZEGG===`03VyV0ף%d°x'ĖV inj%˖55c]ō T*K1fJ0p 8@C$q) cl4#Ugy98(xӗBvnimn'ْ.>>xΘ^¬B墜E:8GVh9S)`@ @{{g>,sر?f0k'5ոuנPFUzyk3\V2P]~+߼>c ^'?=?T]kLQ(ƟFFn vH$Bgg'wqdžlj9a-&2`pIV$N$ED7LFK2]zW%G5rݲls RR]vݗ.)fefcsv5$Qv~ݢ~D}ĬZE5bH'h=W@htG˞bg䋅s[FJ:x""> /x`6N<5\\ʧhL AH<)$UĥnRv5 zM%d2C6MKiiF9aJlڤo}ptt4y 2.#~Nr:.D^3G :_jWgeeel6E^^Ţh4~sU3G5`řWzFTqvAd<<gQSVUl6p8صkfʀ$4a٬>]e < "kϬ>`ONjc4UX3P4f96.;]4U֐7j@*| t#ʖ-v#2"8"W~i>'hu7tj>c)9s+Z>gV̋fD^h B&`` &۸l:T|J%=]|*}fw4\nk_r3D9\Pa Do'͔Ϊdlc1KY3ɬT[ 81Z5n8'\k͇䊹twM*"CD\:xuG<7[OG*B)e,BPICA-ERKNAnuxJԉ2k2$σP?\PgMThjbWft(MD'_͊jJ;KJ1$Jt R_F"ć!?Nz!.L.*6Szn:Ǚ[A8*j0z^Ѳ@K1<}j` 6 efHڠu(BDM򹉛'QSJax#7Ohx! )4 tTίN= `&(أ͈gjJTp@Z|aRU2 B_oOs{Ѫ(+BFUjsx/< 7UM%bnEOШlPXnGy8gjSd#60޳NxP?*C^Q- F=^;UOd!]@l"EX6:?6"a1NN&rVWgq9gIVAXs04{?pԇǃd8JEY↲7i7ifŷ ;\l@(8|zP _ϷAZZ [W!bCpe>' ~,T%@]-B#xcT0Χڀ|Hޟ7)tZM 1&?~7k[:BgW:L(Mb s'bv R)ɀu.7#:ŕQ2To|L8+6AH7؄_Je? mz/ 씺S0G˝ugMWGdI`1EN)b݇t᥂؄rl5l[/Ni?s񆼈I!DKw yÓA Y/< GRo@w5xY6S⟭,vn@͂M!}@3=Roǭ{q>?eqP`|#,R}.㦂i9^I`'ף!k2ne ܯ>- Jpd!߅Y eJ0đ;'!X|/x_ QRmB& 0k__<>]R'xsGw<%H?Yl2 ={_?$BhQj!_]6b^3<@Jl2 ={Dk)ёYC!*6EmŒ3`!B. \Dp'ҚeH 9i52р,ZhY +f<"`,)Wהs̈́6Tg&Ma!iFsN( 8!@%z1 $"<lY75kT:aj 3 T_s ..P `) Vc"$)DC a%/< ӹEiW*eD& A~,:o5~ELOVb$stG lZx!2$+exVEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFf6j4IENDB`virtualbricks-1.0.2/virtualbricks/gui/data/tapconfig.ui000066400000000000000000000247061262207653100233050ustar00rootroot00000000000000 True False 4 2 6 2 Don't touch interface settings True True False True manual_radiobutton 1 2 GTK_FILL GTK_FILL Use DHCP True True False True manual_radiobutton 2 3 GTK_FILL GTK_FILL Manual settings True True False True True 3 4 GTK_FILL GTK_FILL True False 12 True False 0 Connect to: False True 0 True False True True 1 2 GTK_FILL GTK_FILL True False True False 3 2 True False 1 6 IP Address: GTK_FILL GTK_FILL True False 1 Netmask: 1 2 GTK_FILL GTK_FILL True False 1 Gateway: 2 3 GTK_FILL GTK_FILL True True 16 16 10.0.0.1 True False False True True 1 2 GTK_FILL GTK_FILL True True 16 16 255.0.0.0 True False False True True 1 2 1 2 GTK_FILL GTK_FILL True True 16 16 True False False True True 1 2 2 3 GTK_FILL GTK_FILL False True 0 1 2 1 4 GTK_FILL GTK_FILL virtualbricks-1.0.2/virtualbricks/gui/data/tunnelcconfig.ui000066400000000000000000000203231262207653100241600ustar00rootroot00000000000000 1 65535 1 10 1 65535 7667 1 10 True False 4 2 6 2 True False 0 Connect to: GTK_FILL GTK_FILL True False 0 Tunnel server host: 1 2 GTK_FILL GTK_FILL True False 0 Local port: 2 3 GTK_FILL GTK_FILL True False 0 Password: 3 4 GTK_FILL GTK_FILL True False 1 2 GTK_FILL GTK_FILL True True True False False True True adjustment2 1 2 2 3 GTK_FILL GTK_FILL True True False True False False True True 1 2 3 4 GTK_FILL GTK_FILL True False 6 True True True False False True True True True 0 True False 0 Port: True True 1 True True True False False True True adjustment1 True True 2 1 2 1 2 GTK_FILL GTK_FILL virtualbricks-1.0.2/virtualbricks/gui/data/tunnelconnect.png000066400000000000000000000141521262207653100243530ustar00rootroot00000000000000PNG  IHDR``w8sRGBbKGD pHYs"":OftIME)/ZxIDATx]itTe~{oխ[JodĐ,@Qڀ6miQϱ?s>֢DKea $^ֽUIHC[Wٌ @FFC)&YQL0 dx>-<χ l9iZ(//&Yyyy~L&.111bV9&:znhHt:##1m4|K <8j}ޙ2 H9d2-Yf$%!cLPFCE,ˠah5z|s',r gjj-iMDB`X0-11(2,_<=ǛF $I"BSM̹tJH!؉gʟ>MW ٸn,JW9dp0вGoKyyph 9:nﲒ-6HqQB^$Kgc÷mmm \TTT lNtӫW0=yB)%CQz?A(`YSLmmn(ifee%uZld͔B(*^uG_,˂Rii41! 70%U 蘘LKC\W9fÅVnAѐx,H\F:]BHy̓& )oټ sKKԄP<tD?\.q^XUUUN,()))4::~T$2,_|˗/cҥ 4PYāC/::;[,.Wo0 :5!3=,iѩw-[ <\V VKA@ԩXz5LO7Մ ªdbFCeYT:wQ(‚`+Ba~>jwD)kJ)\n7yQ|jYi:ZHEQ _YXvyYz%C<6R t7*q 5[H)BE*QOl3zzJ)څA8EQ~KR( aY>P&.!qB(-f\} ;p8PNt:=TqtސB+NJ{ԿO,H$fp[UbFYY@t!I0LbzFFݩnk\Nj{wtv{3(@)?)*lhl|B[[Yo{ޕ0p:O"Z Tħ۷jOApM-Kez%rС9_~_dX'wUx,. xp?RSR@Yzȴx+", A< Bϙ7yt:zU.^wo RR rx鷿D@KRQnEGg&H(Bex$ 3f`ƍ-^/ ~3D+80Wq`*JpKy9Ξ+V yIۋ  ,#6&JJo'ܮϵZ-t:x)88˗cɄ`< ]& ϙ bח_BE0dg!,'N .6&C1X_V ؁!g8W#\n7:¼.׬AGG>S|Xt)rYz6oM9"o00H,(SOE[|'HǴx".&Fm/ Gd4BqE#qAY(#?8Es8܌:~-lv;"#5k󥗠PWHG=?U~%}#J)n7bc1->}!^K۹{IUF3=V+V+lv;86ѰPԚO!.PI3inl0U߬( JjHSp0L&AA2 + j /#@xDѿ60 85eY\hm#EC(JgYUU23qWq1۸㸛Rz|]Zd͚ _ dy~EX{{Qo[Zmҏaxgq\.WQTP/T^kRVM7Be޻Y 7 !,r{;<^ >H8].H7j"hr`h՞={<frj--*445xV,wVFAsf>Q`6 wW";3} ̟E,dYw^Çq׼yB|l,(himW{bHJHqwy2}:sR A÷ ]px$ 9YY z]*du5 a2~P&Ʀ&Z&lkx1-.Ĥt$'&w|Q, h<`Fh.H}V+WWc…< F#nۆ9s2}G9Fd2᾵k'h4zςqIYc4p,Ow5k 8T;^O= lKX,h4~BpÚ5tp؞9f0 nH짃Ao_-[`o*InSO>>]]`%YFgwfDX^{rRx$ `0`mXd """; ;6nmc)IʥK{^cǘ0 {zpfgdu% .`ڵj:90P-B}C?toƇaY>s=V+nL 7fy?"7;M?tCS|xgRѣhmmòAbB22P^YW_/< mW;:%%)d }$ZwMe(aTM NDjJ /X(o(}}}X` Zxh(A}IJLDcs333Gy3fWuU^h  JF\njqªK,$9@0p9KAdx8N"7+R m6h5~Tm/B/gՅ)SDhZV!1،j`:qnzeDEF{f$F9vqN'@NP p%p n:r͘ Sp0ԣbj,?xHGa~>`7KHNLvB'n~l]Η^x<x$ _a ը;rlDFFBK'e\_|ӉXڽKKʶ;LKuA`0͈LONf3y;/_ƺ5k3(3plEettuA/0Aƛ njDFD`怜A___-=}Pw}gw7N>X^Ř 8N8(yBgr{;*vڊysb٠ܲg(zHQϯ~[RtcY445흝/ + vtY\|,#=- . ahni F̛%71v wA󈉎ܢ" ϰL!-:z+m.lCL@RBHqOz[p k4|DQĜBcJp0dEA7;3 4R(EYj<~9YYԩ].!^f*aT8Xhf$'Cמl۾CYbjHlsARm6l߹Z? Zm 骮a@f#Jv؁nܿ~=y=\hkC…jWMn|O5jFgr58SWʪ*t t^7=%>p99;}#3=,qDu3}!p9ޱn uCEE] qo>X;)ݻ۱t4f3f$'p8P[ |}4־>E.nka.'EN9s&av@-˅fn7` \@@A)Lo 1 65535 7667 1 10 True False 3 2 6 2 True False 0 Connect to: GTK_FILL GTK_FILL True False 0 Listen port: 1 2 GTK_FILL GTK_FILL True False 0 Password: 2 3 GTK_FILL GTK_FILL True False 1 2 GTK_FILL GTK_FILL True True False True False False True True 1 2 2 3 GTK_FILL GTK_FILL True True True False False True True adjustment1 1 2 1 2 GTK_FILL GTK_FILL virtualbricks-1.0.2/virtualbricks/gui/data/tunnellisten.png000066400000000000000000000103761262207653100242240ustar00rootroot00000000000000PNG  IHDR``w8sRGBbKGD pHYs%tIME")P=~IDATxypם?=fi]m@@`;a,eS[lBŮح?Nr\7>Ȇ$vvcFPI3陞?X FbU]*{YY_$Ib+M,>Qx5Й#T(gk,$ ,ހ/)D3[ѭv]7[`Fu Z)ѫ b"kGsl*ҝ`0&` n-q_Q \jM=B XZ3pˇh7)e܏TwŌddӨ)ii:\u]BO/*eYźbFy| 4Au஫n'NxdY;L_Eʯ[9M2  ypPxEY7!eYH]dB`41 x !Ct =FhF.IN 5(Jz ˲?F9î֔a ڤ.)X0_#(t\3Y U#//%UTňmmS=[Qq/,˕-:g4%/`cLPyRw[F`(]Yop w[RSՑk]x?"ֳDQ}VY9_]:{ORwK࣑2,[RdUd IS {I-EyyԢpϺkn3݆wSL.UH$D2#ՎH$D"'"_ܒk|cOx 25ɀn4IyH$aֶݸԙf*tR O(r2Gc td7 7](Jd<{_6%xwo#Eh1gy!0q_Ýʲt~kޜ1^Q? *-ͥUG>6n;EB< <=kceIO^(%eU^9ڽLދMF&Ϲ/2uE7E3HjAXŋO;Dϟ֐Hkێ5X#m709{Ʉ`ݤ4ϼW??߮k&eb5(ָ||Iũ(6] 0X jjDySe dYik!gzR^)<}LPzm sC:]IZDA`݊%t 3'yH9dcu]`0H&0_w ݃ Ζ-;Fo4 hr!! ݍd4|m~D1{fΝmn7XSOQ0cl˕d[:;;yWLs8hhjbƴiþǡ#G " v|,_כNy7hQ"leAUaS hoo'I>id2$'Nd޽l2A:xBx ګR3r-jjXa+y㭷ϲfs./'صs'Po[*?#Zoo<_}n˗5ϟ=mcϞ=̟? ַeG($ϭ]۶Hw3 Db1i*][GQQeeeEQּ.]:x"֮e-J~e ϬYC,ロ5 ht⌀VzQ^u۔ evReyVRJEi):ڊn#`̓e*lG8|87o}oپ Ld !݋ct`_SXc϶޽_6Q> y&TUst]C8r6o WU* &[ 8LBL$W7kog|6O>@ssg‘Ç)4:::xшjrECgg7Cmmڨ kYr뭃"S­V+>Ádl6c0LƜo|c,w/ď|| &T+klnu:׋"//ݎfC"9:&~3LPWWn/d?|Pk먓p8(**:Kގ A`M >CǏSY^>QK7l6v˅@M(T_]^ΉǙ;o@u5Nhُ x<\.v%-I0!;RYfouyS'FNII N{I2 C'n%Kluu>IaWUW_'=ȉt_GQQnu&f)SD"}Z:;$nNUgύ*X1~l{|zׁ\J)))a^vs]ב0 84;vH?#I jS==>  8N(((p\2FcN~;ݬ__(nA)RJEE҉郎GmQy2d2/g$0gx<_g2L#4Kx $ +Nxx䦺:. "IҰM#(뺎(tQUoL:h¸S\\LaaLVzS{y441Zv |>kßq:[.{ _N!+`_o]_O躎g(ȴiznA8v'Pu ((HrL|i_Iv-!J 3gGz! 퀦I)/d Cf0Œ!IP"PXL&K.I#E[[9C9C9C9C9C9C9C9CHUjvIENDB`virtualbricks-1.0.2/virtualbricks/gui/data/usbdev.ui000066400000000000000000000073301262207653100226150ustar00rootroot00000000000000 300 False True center True True True True False True False <b>Use CTRL+Click to select multiple devices</b> True True False True 5 0 True True automatic automatic True True lDevs False False 0 True {0:id} {0:d} True True 1 gtk-ok True True True True False True 2 virtualbricks-1.0.2/virtualbricks/gui/data/userwait.ui000066400000000000000000000045121262207653100231670ustar00rootroot00000000000000 200 50 False Virtualbricks: action in progress center-always True notification True True True False False True False True False Please wait True True 0 True False False False 1 True False True True 2 virtualbricks-1.0.2/virtualbricks/gui/data/virtualbricks.png000066400000000000000000000041301262207653100243530ustar00rootroot00000000000000PNG  IHDR qsBIT|d pHYsmOtEXtSoftwarewww.inkscape.org<IDATxohU{gIL1v3j$nsHs>XkGt`X)tpîۃBe8֙WӴkG3M%jfso#9{YwwN5ZD@B@!P( Yndom۶Z{#^}51 !&oHt0e?ecZ)a9B@!P(8 A B@!0uk4Ƭ@ 1L 7R_5~ZD~04tֳ܈"C0a,es%R'GZL'ɳQh:.O>¶ZQ%&R(q A BG!(x*| :1hss󑞞|5Q5pĉo[:ZX&9N۾+qSWS =)E:#_zǏ0Nw5zt˽ի'θ(Z}tHXk-cOC aE4x2\r֒CwErl 37W2>xeObo߾^Ҳ,ul5]]78O45eu&sVsZ8fM\vm6xѱ~s?KD`ٳKYŽRe-lV(0 ; 3ss${/~^(gy%ߏ4KYzAS(q A BG!Q(qvMMYyovua;; ;;1WJ84l2 J^ mjZ^֬!\3331&#+ok1JA"TL&̖VoozS>F˜oo7n|<9ŋC7=nl a|`^ ':"Y=##WOXqWxHo\G^#ֶuyB{Fz,X@!P(8 A B@!PDo:%Jou47_.|di_*˜3q.ycJ2ݹmjJgX$|sgV!oaM6<}/Uض6~o{QK_gnnQo] яކ_.=F=?_2w|d $+t7171\(78HC?vcn{/VrŊ!-I)u%\Z)bE8 A B@!P(8 A N!ؖePGo6^vl[[E6tڵ 1A./i137, ghhsϥ{4ςGcMsΝ?ږ8f1 qXsIoo7W۽g-Ï߯=?7wg1G,_#$&'1.U 6W'|ִwzJŢ A BG!Q(q A B'<R vdyՙ|yB`c GvuUdM~׮\0#d5 A BG!7y;sN:fIENDB`virtualbricks-1.0.2/virtualbricks/gui/data/virtualbricks.ui000066400000000000000000001417371262207653100242230ustar00rootroot00000000000000 lBricks True False True False Toggle window True True False True False Close True virtualbricks.png True Virtualbricks visible 800 600 False 2 Virtualbricks center 850 600 virtualbricks.png True False True False all True False _File True True False gtk-new True False True True True False gtk-open True False True True True False _Rename project True gtk-save True False True True gtk-save-as True False True True True False _Import project True True False E_xport project True True False _Delete project True True False gtk-quit True False True True True False _Settings True True False gtk-preferences True False True True True False _View True True False True False _Messages True True False _Disk images True True False True False _Create new image True True False _New image from file True True False Co_mmit cow image True True False True False Images library True True False _Help True True False gtk-about True False True True False False 0 True True True False True False both True False New Brick True gtk-new False True True False False True False Start All Bricks True gtk-yes False True True False Stop All Bricks True gtk-no False True True False False True False False Configure True gtk-edit False True False False 0 True True in True True lBricks False Icon Status s True Type t True Name n True Parameters p True True True 1 True False _Bricks True False True False True False both True False New Event True gtk-new False True True False False True False Start All Events True gtk-media-play False True True False Stop All Events True gtk-media-stop False True True False False True False False Configure True gtk-edit False True False False 0 True True in True True lEvents False Icon Status s True Name n True Parameters p True True True 1 1 True False _Events True 1 False True True in True True lRunning Icon Pid d True Type t True Name n True 2 True False 0.47999998927116394 R_unning True 2 False True False True False True True True True False True False gtk-save-as True True 0 True False Export as Image True True 1 False True 0 Expand Horizontally True True False True True False True 1 Expand Vertically True True False True topology_lr False True 2 False False 0 True True in True False queue True False 0 0 gtk-missing-image True True 1 3 True False _Topology True 2 False True True automatic automatic True True 4 True False Readme 4 False True True 1 False 0 none True True 2 virtualbricks-1.0.2/virtualbricks/gui/data/wire.png000066400000000000000000000121771262207653100224470ustar00rootroot00000000000000PNG  IHDR``w8sRGBbKGD pHYs%tIME!8r IDATxyl}ǿ{EQEY#$[qΐmZvC6]il5膢[v]聵[YDdAOIc%Hd}i]iھ@y_nǏ1ƾ@@ -m6 )aCC@ Ӊd2pkBHi>e]رc?1>>P(6ttt .o>BNCu>6m p'<{+}DVʕ+E[[ {8Oia>} _GJTV"xmX񽠞G@m"E{ra(qE W !-e9sU @^ ;|`%WE7? \tXD"~\|o6&''W7hk9sL`?ACwt;H=kDhŧanjrEy,B.]/"H y+!ղgφhhh/NnܘO'A؊ٻ &V:;'z :::յ:UBH UŖSNEȕjzCBѢQ99 qi6zz,ow\`06B!X֚v@+ESN F +9-aXh+]X[T]3*ˀ _ n2 ŋ1<<\C9ADQlyF~mȕ;N =KgH``U} L c9ȉX*B?ֆ+DJNާgح- Y~V)#{ һf\O\9ҥKX/@?BH(/766lF%g>AxIVt33 K%.g/;V'u˲055P(N@<`ssM%@<\7>MKwȊJ2a q|SQci.VxSLò,@6ӧO WrJ6m889/+i ]!2AxG;V r9<0\JΓ?0b@H& 1W?a G+]f=,p\4 "J#N{V}Fכl6l6 4aYb2LΏ~eA ?q?6`eAf|ώA9Mg.ot,Kz@, # UUt:7˲L&Mp8d mTO>.t:ȑ#z'ը 9L4Mz׼"vS###z0::t:J)TUE6 6o߾u=p8PJaFbtt4ϝN'DQ8bDQ_xתa޽Uv7Te>nu-f100Wx 08TU]#ƻ$IŶm0::Isg5p//(XXXX]F155In;BPTDe.r @U8w+r8!BE%_|pBl 랃Bed2BiDQqTVVB%(DU͡H$7h-XOMs($ITVVl!(/"JcxxHHTzgyu(7\jX[[ EQr " øi yCuwet:ukm Yb1DQGL&!I;u/2fggo?GTj?JJJx*\.W$-JU4a$:OTTT,#LBu @8F2((..Ο?99W_=ա^ /4o'?YjYV3`۶mxuV+N7Yg ]`ҥ.DQfW\\ JMϯWgU\G(Okjj.gaaՅ)TTTNev30==AJcW^y33u @Q|gd2lww"H7i<`9?<11E('l彳;v(޹sӳrJP\\R7x# ,Bp˄g{M#@}c%$-#G˻}:\\c֭&<44u;44t:j~hQ122ż$r~RTsm.xcO,*xu]K僣zTTTu]~梁#@$Ȳ Y I2dYT T >΅Z_M!@cǎ9rᡇBMMM~* )]t;_^y5gyݽv%._,Pyq3ԊGmnn~ϓp!MeFE__0<< b&0>>۽.\p]w؁H$4J/䌯@Qd( UUEUUUPUՑdcAMM  z6\p8rRJGNӮ󡤤N#3P &&&PVVl SQVVYq݈(ϵ0@UEPU @U58*<2^UU)H$YWW 7\p(Jgg'8~?P\\ EQ`fsl6LOO.\uH333kZQ Ғy$)PşEk4 ,sAS*\%Ke}fd(;Ff8~u޽?]B{{;t]Gee%N-OmuΝ[5+B(E{{;c Nq(ZVn,I.Ia1@̔k/d2]ң>7\p8|9]z pFnqYǃL&uoNL7ܲ*0d4A(ADQbE)Z3cU*j$ I߮]H䶿Krر8pO?@[`aϞ=7D$ u5ḟs0@>#BƖ-pJLQT&I#0JMJ5M3cf0 0燆GzΞ/}}}Cp555RJݑH`%%%(///xj5[w Y122D`08 (]Ŧ錢$I1Eg-ҌiҔeVB(t:t:`08X&DWUU4MK8 188 ǃ"zÊilCii)4Ο? i[l\[[M}oo/P(ӺtZ&T:t:cR+E)MX`Y< eq4: g7K;{}?fiI$˗199 ۝Y/Qsl5M9[o!O<9~ C%)TLRUEQj ˢ ӤeYԘ! )Xm>3 Re3p8bMM !U8:;;H$PQQAV( fggAɯ +z;,P;R4XRkR:gYV<3Acdf1:OKFoo/ߴ, K񾾾gItvv4M~8Kb1~n$I\p!7ir+ٵ #YzVftR3nƴa12 c,E)My<ɓ'M댨GO@7{ce|uF*BUUU>b1^cccݼHr@gD˲ ӤӦiĒɅ#TULI:yis@B|$iGLt  pwBv- =^bEv JMF6L&( %4 Ig}6iBikkcp4MrHu)#שp\ڡCNG䮱})MQ$)ARX)0R۽.&a|f&ljjs 1۲,K;Kz_6H{|Cg^N8!fK3v;vG}aѣQ'`ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc4@eIENDB`virtualbricks-1.0.2/virtualbricks/gui/data/wireconfig.ui000066400000000000000000000046501262207653100234630ustar00rootroot00000000000000 True False True False 6 True False 0 True True 0 True False <=== connect ===> False True 1 True False 0 True True 2 False True 0 virtualbricks-1.0.2/virtualbricks/gui/data/wirefilter.png000066400000000000000000000206001262207653100236430ustar00rootroot00000000000000PNG  IHDR``w8sRGBbKGD pHYsv|tIME"ܺ IDATxy`Tս?rgd!+@ PA@@źuY޳R֭\X%l" dH@l.?HX(|Iss9wKOMMQte%Ib-_O< LLD;Շ.Au[Mo8fٲ?֬dy;^pddZ: >>ݢ"[EMBTB+Dǘ7 lzԨۖ.it/.j11}am]Ǐ3gboS $Voc 'VU"5ա/TGŤlz&NkMC~&՗`M'CSSŇFj<.׃4e=0KǢ$fI/L34ied_8|{64^batcctٗ_j+Z[kSS㋒$w79r;0*(o_Km@caC۶]`;vTjz$E7j(4R}KRΔ!%#Gj"GoL}0}mmMZ ~$eh, z |@nwTd~鵦cIIIXxuϭ]۴tҖ1MM)fD+I; )\;wEQܽUyeȰa-?4(.) ,_qǓlC%gɼYTD~Zw?t_)>~=qW>5zWg⚌.ez[WsRZ7x-!iNĽYȌm#FH}>WVHee# _z)`5#+1dNw?{F%QQqF7WmMz=oT#9LCKh蟶F6FMCH~^Y:` ﱏJkɎ#SÁ"ae~K``L UzS ?bC#GJ61tQ-\"_Of5ʼ,>ՑȟoOwS{'˼@dMACJH|lIpjxpvyx.%ѣu3La~fM`$2Mhl7j2Ϳgf4c9뢔~ԻFK=P&3 Z{ԃpug>8f*-5?qG\jK=,uϞwS` |h$I%IsGZg?|Q뙻ʓK}v$;̗y`~|ӹ4$NZ qng?~ϞP\8'IFĉ׮^U >hr-05:%3ێ<&<X h?DG7IÇ1"Lt^RI^yk$}s/5\l8*l (lz9o]OypXYg:`8~1MZZ5cWب{mhp| f e٣>~?oxBҒ 1@'M˸&&# ov]wh #+ 珀`] OKIiJ8~\дF#]y%8DOAYu낋"ŠhN.myC3G,W6mPO,5{GÜŋ}hh8g. v1~l]=q֌ I)co\c- *wYB"ЎGQqͅ䗀 v_q3Ǐ'9*}m9z,_[Z@EN`ľ\?YcU%/>ai*wYe8mС:v,I4M۶ɿֈDwFГaUM~ Mx,,?0^ x=pJ?8+!Bh/LQڌAzaP{W )/"EYQ L3~BLTp )/9<\~l+%& #@Myh j߁I(v^^-&HyKc--G[Bqk {K| Fҧld̔+:8WL=w"Ӛ{6_5+y&cݨ@Yy[aNjC5 (H^7/l_1ƘF}yii6^{DLT;RzD6G{QTS>}yآ-;ysjBsDIMLwwzթ#΢ Jr CCԠ g_cbcƄ\yexp?wewl g>vT`i*i.m<,Hуi( ߭⓼4<[oӳ׹`Xxg,Ľ |{\ʕۮ. ѽsQ;dXol@A,OYLp_~c'[ԙ4k GrJg7ڙ ֙E>~Vo^Z֗?|)y36Pckc`sv)S&tteӧO?AsaP*7=KJQ]L~MЙrl+^dݽu߽'% _eiE]qwK/1zhiiӦye E\4[)C"P4zݹf~5Ef#4mڴ.G P]]iAxzh[ 4FCAsGIՍ@+5;Mv -=dv'GV.GG&MJ0fpu  p{͔(Ȳ̆ N(R4M{9bݺu]GG/,Γk3O"|w~ywm/-hu˚_1ykxM6$I >>o0."cDDQDQdɼKL0A'F|upM~P}o؜[>=y2xWc!yb~%BhY̼Nai]61ɴÖ]PQ^+;5M{'1J*19~4 ݉W%OFixrM>| pa(>of.Rd~&h?;8m<;U'R#f}Xǰ0gD*%G5WEmaRai3VS_ NA3e!翆&#?s4C<M:(('|›ox_=bŊx{ļ odһhySns޼t_:4@pA$3bo,eq S{s0|L.#"M#8伿Zw'̟ʒ%KXf 5M'+W`$x $EpVzI4nPӯ#س('O S01&ba4t~}u=,,`ʔ)m&>uW6Jm(Zh;?B5~+uiH9r$պeee ^ƜnuI.[!rY; Teiɉd쫩=nA{z}ޣ>ʨICކа?ZhQW &}MI;hƎKff&P(4#//ojAAVu<e>xw5\,@0*vA@ߞK<R GOǒH֫zՓ rB!0|~ieSL~SOqW% 1A xw#DLԘLh>--믿NGYYYw{EE) a0I`4/kD'G7;HZF͈zv/=? m0֑ؒ?u00KE;@~~`֠Al6ION~B-卯̒``\s5R[[[(D$`͠: `LJW[{P~2WUpL#;=WS'0ph?^AԐZBaÆrPUhg!-f`7^: =7-VnW-Z'>>K]I:+ LMSQQwfQX8GMMM: QVVl{ӅDxziE Xv-`A||tErrS.zEQihhjj?-)).iLH9cr{*z#Z<܌3==0G򶩪ZTRRb 11[nOrrr ~~!łСCXV@kk+۷ogP(qo}J2f6!_0oVUz:{liiit&!!ÇwYQQ :zH$t:@4`Ν;ĥkSEqNyN111'p~ݻO(pD< й6;<3(//?q9RRR:.ۓJ\ ;yf_jhhHlliPKKȑ?~'֜Sj)jA u74aX>|8ׯȑ{I8zAp455i^|ŵJ3f:A3f //>e9jƲe;wh?eep8\lo :#:(:x)&&cOWvg~"==EQ8 Nh4b4$ łd2BٹY@[p<''g Ef%Mh{EINNyfni `0N IV!9Wwv_@c>^Ӵ f#33,rN3)ȦMhii,F^h4v@$ Ʉdl6@(N.,fj Pt!lo߾A `0Я_?, UUUlٲ=-55u… /@Ӵ~:t !11MR[ZZn,,Ц k5M+:|E$!vic0p:l߾YUMӞ\jՓߜNgYf~~~I$"4aZ1L, fɤĨ].WرcVtq_@&| ¬#GX YYYt(33]v~TU[jkt:K .#Rkfbt@l$Ih6ntnhӄ5:zME^b غuk>@ 7wgIItn˭p=SfjAthʲ(dήv::mА u1|;>zA%+WN 6\q(v;(,GdY ˲T9hpKKK=:m!jc~~*`fUU{A]L/..nm5999K=Q-fYe9,r Ei*eEEЦ Mł lnne{"ѯw[ZWL&^#_Qd,Y] -'$&IDATIj,))iVhӄE(󊋋/I\ZZ)(xZ,6HDvG"r,eYi4 W4UIENDB`virtualbricks-1.0.2/virtualbricks/gui/dialogs.py000066400000000000000000002235351262207653100220600ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_dialogs -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ Utility module to work with gtkbuilder. When a new dialog is created a new glade project must be created. All the UI definitions must live inside the `virtualbricks/gui/` package source directory. Then a new class should subclass the `Dialog` class and define at least the `resource` class attribute with the name of the file (`data/resourcefile`). If the `name` class attribute is not defined, the name of the new class should be same of the main window in the ui definition. Here the about dialog example. 1. First of all the UI definition. The file is `about.ui` in the `virtualbricks/gui/data` directory. In this case the main widget/window is called "AboutDialog". 2. Class definition. In `virtualbricks.gui.dialogs` the class `AboutDialog` is defined. The `resource` class attribute points to the UI definition and the `name` class attribute is not defined because the class name's match the main window's name. 3. In the `__init__` all resources are initialized. It is much better to set here all the resource and not in setup.py because is easier to switch to another tools in the future. For example `pkgutil` in the standard library offer the `get_data()` function. 4. Use the new code: dialogs.AboutDialog().run() Note. Everytime a new dialog is created, a new gtk.Builder object is created, this means that more than one dialogs of the same kind can live together. If this is not desired is responsability of the programmer to do not (modal dialogs, etc.). This means also that dialogs should be destroied. I'm not really sure about this because when thare are no more references to the dialog instance and the gc collect the object, the builder instance is collected too and is the builder the only one that has an instance to the gtk.Dialog. So, do not store a reference of the main widget or of the Dialog instance. # don't do this about = dialogs.AboutDialog() about.run() about.window # here the window is destroied # neither this awidget = dialogs.AboutDialog().get_object("awidget") A note about Glade and the transition to gtk.Builder. Glade supports gtk.builder but this must be specified in the project paramentes. It is also possible to select the widget compatibility. The current version of gtk in debian stable (squeeze) is 2.20, and 2.24 in debian testing (wheeze) the, in a near future, new debian stable. Exists a tools that help with the conversion, gtk-builder-convert, but its results are not always excellent. A window at time conversion is highly advised and possible with gtk-builder-convert. """ import os import sys import errno import tempfile import functools import re import string import textwrap import pango import gtk from twisted.internet import utils, defer, task, error from twisted.python import filepath from virtualbricks import (version, tools, log, console, settings, virtualmachines, project, errors) from virtualbricks.virtualmachines import is_virtualmachine from virtualbricks.tools import dispose from virtualbricks.gui import graphics, widgets if False: # pyflakes _ = str logger = log.Logger() bug_send = log.Event("Sending report bug") bug_sent = log.Event("Report bug sent succefully") bug_error = log.Event("{err}\nstderr:\n{stderr}") bug_report_fail = log.Event("Report bug failed with code " "{code}\nstderr:\n{stderr}") bug_err_unknown = log.Event("Error on bug reporting") lsusb_out = log.Event("lsusb output:\n{out}") invalid_mac = log.Event("MAC address {mac} is not valid, generating " "a random one") not_implemented = log.Event("Not implemented") event_created = log.Event("Event created successfully") commit_failed = log.Event("Failed to commit image\n{err}") img_invalid = log.Event("Invalid image") base_not_found = log.Event("Base not found (invalid cow?)\nstderr:\n{err}") img_combo = log.Event("Setting image for combobox") img_create_err = log.Event("Error on creating image") img_create = log.Event("Creating image...") img_choose = log.Event("Choose a filename first!") img_invalid_type = log.Event("Invalid value for format combo, assuming raw") img_invalid_unit = log.Event("Invalid value for unit combo, assuming Mb") extract_err = log.Event("Error on import project") log_rebase = log.Event("Rebasing {cow} to {basefile}") rebase_error = log.Event("Error on rebase") image_not_exists = log.Event("Cannot save image to {destination}, file does " "not exists: {source}") invalid_step_assitant = log.Event("Assistant cannot handle step {num}") project_extracted = log.Event("Project has beed extracted in {path}") removing_temporary_project = log.Event("Remove temporary files in {path}") error_on_import_project = log.Event("An error occurred while import project") invalid_name = log.Event("Invalid name {name}") search_usb = log.Event("Searching USB devices") retr_usb = log.Event("Error while retrieving usb devices.") brick_invalid_name = log.Event("Cannot create brick: Invalid name.") created = log.Event("Created successfully") apply_settings = log.Event("Apply settings...") NUMERIC = set(map(str, range(10))) NUMPAD = set(map(lambda i: "KP_%d" % i, range(10))) EXTRA = set(["BackSpace", "Delete", "Left", "Right", "Home", "End", "Tab"]) VALIDKEY = NUMERIC | NUMPAD | EXTRA BUG_REPORT_ERRORS = { 1: "Error in command line syntax.", 2: "One of the files passed on the command line did not exist.", 3: "A required tool could not be found.", 4: "The action failed.", 5: "No permission to read one of the files passed on the command line." } BODY = """-- DO NOT MODIFY THE FOLLOWING LINES -- affects virtualbrick """ def destroy_on_exit(func): @functools.wraps(func) def on_response(self, dialog, *args): try: return func(self, dialog, *args) finally: dialog.destroy() return on_response class Base(object): """Base class to work with gtkbuilder files. @ivar domain: Translation domain. @type domain: C{str} or C{None} @ivar resource: A gtkbuilder UI definition resource that a data finder can load. @type resource: C{str} @ivar name: The name of the main widget that must be load. @type name: C{str} or C{None}. If C{None} the name of the class is used. """ domain = "virtualbricks" resource = None name = None def __init__(self): self.builder = builder = gtk.Builder() builder.set_translation_domain(self.domain) builder.add_from_file(graphics.get_data_filename(self.resource)) self.widget = builder.get_object(self._get_name()) builder.connect_signals(self) def __getattr__(self, name): obj = self.builder.get_object(name) if obj is None: raise AttributeError(name) return obj def get_object(self, name): return self.builder.get_object(name) def _get_name(self): if self.name: return self.name return self.__class__.__name__ def show(self): self.widget.show() class Window(Base): """Base class for all dialogs.""" on_destroy = None @property def window(self): return self.widget def set_transient_for(self, parent): self.window.set_transient_for(parent) def show(self, parent=None): if parent is not None: self.window.set_transient_for(parent) self.window.connect("destroy", self.on_window_destroy) if self.on_destroy is not None: self.window.connect("destroy", lambda w: self.on_destroy()) self.window.show() def on_window_destroy(self, window): dispose(self) def __dispose__(self): pass class AboutDialog(Window): resource = "about.ui" def __init__(self): Window.__init__(self) self.window.set_version(version.short()) # to handle show() instead of run() self.window.connect("response", lambda d, r: d.destroy()) class LoggingWindow(Window): resource = "logging.ui" def __init__(self, textbuffer): Window.__init__(self) self.textbuffer = textbuffer self.__bottom = True textview = self.get_object("textview") textview.set_buffer(textbuffer) self.__insert_text_h = textbuffer.connect("changed", self.on_textbuffer_changed, textview) vadjustment = self.get_object("scrolledwindow1").get_vadjustment() vadjustment.connect("value-changed", self.on_vadjustment_value_changed) self.scroll_to_end(textview, textbuffer) def scroll_to_end(self, textview, textbuffer): textview.scroll_to_mark(textbuffer.get_mark("end"), 0, True, 0, 1) def on_textbuffer_changed(self, textbuffer, textview): if self.__bottom: self.scroll_to_end(textview, textbuffer) def on_vadjustment_value_changed(self, adj): self.__bottom = adj.get_value() + adj.get_page_size() == \ adj.get_upper() def on_LoggingWindow_destroy(self, window): self.textbuffer.disconnect(self.__insert_text_h) def on_closebutton_clicked(self, button): self.window.destroy() def on_cleanbutton_clicked(self, button): self.textbuffer.set_text("") def on_savebutton_clicked(self, button): chooser = gtk.FileChooserDialog(title=_("Save as..."), action=gtk.FILE_CHOOSER_ACTION_SAVE, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) chooser.set_do_overwrite_confirmation(True) chooser.connect("response", self.__on_dialog_response) chooser.show() def __on_dialog_response(self, dialog, response_id): try: if response_id == gtk.RESPONSE_OK: with open(dialog.get_filename(), "w") as fp: fp.write(self.textbuffer.get_property("text")) finally: dialog.destroy() def on_reportbugbutton_clicked(self, button): logger.info(bug_send) fd, filename = tempfile.mkstemp() os.write(fd, self.textbuffer.get_property("text")) gtk.link_button_set_uri_hook(None) exit_d = utils.getProcessOutputAndValue("xdg-email", ["--utf8", "--body", BODY, "--attach", filename, "new@bugs.launchpad.net"], dict(os.environ, MM_NOTTTY="1")) def success((out, err, code)): if code == 0: logger.info(bug_sent) elif code in BUG_REPORT_ERRORS: logger.error(bug_error, err=BUG_REPORT_ERRORS[code], stderr=err, hide_to_user=True) else: logger.error(bug_report_fail, code=code, stderr=err, hide_to_user=True) exit_d.addCallback(success) exit_d.addErrback(logger.failure_eb, bug_err_unknown) exit_d.addBoth(lambda _: os.close(fd)) class DisksLibraryDialog(Window): resource = "disklibrary.ui" image = None _binding_list = None def __init__(self, factory): Window.__init__(self) self.factory = factory self._binding_list = widgets.ImagesBindingList(factory) self.lsImages.set_data_source(self._binding_list) self.tvcName.set_cell_data_func(self.crt1, self.crt1.set_cell_data) self.tvcPath.set_cell_data_func(self.crt2, self.crt2.set_cell_data) self.tvcUsed.set_cell_data_func(self.crt3, self._set_used_by, factory) self.tvcMaster.set_cell_data_func(self.crt4, self.crt4.set_cell_data) self.tvcCows.set_cell_data_func(self.crt5, self._set_cows, factory) self.tvcSize.set_cell_data_func(self.crt6, self.crt6.set_cell_data) def __dispose__(self): if self._binding_list is not None: dispose(self._binding_list) self._binding_list = None @staticmethod def _set_used_by(column, cell, model, itr, factory): image = model.get_value(itr, 0) c = 0 for vm in filter(is_virtualmachine, factory.bricks): for disk in vm.disks(): if disk.image is image: c += 1 cell.set_property("text", str(c)) @staticmethod def _set_cows(column, cell, model, itr, factory): image = model.get_value(itr, 0) c = 0 for vm in filter(is_virtualmachine, factory.bricks): for disk in vm.disks(): if disk.image is image and disk.cow: c += 1 cell.set_property("text", str(c)) def _show_config(self): self.pnlList.hide() self.pnlConfig.show() def _hide_config(self): self.pnlConfig.hide() self.pnlList.show() def on_btnClose_clicked(self, button): self.window.destroy() def on_tvImages_row_activated(self, treeview, path, column): model = treeview.get_model() self.image = model.get_value(model.get_iter(path), 0) self._show_config() def on_btnRevert_clicked(self, button): self._hide_config() def on_btnRemove_clicked(self, button): self.factory.remove_disk_image(self.image) self._hide_config() def on_btnSave_clicked(self, button): self.image.set_name(self.etrName.get_text()) self.image.set_description(self.etrDescription.get_text()) self.image = None self._hide_config() def on_pnlConfig_show(self, panel): self.etrName.set_text(self.image.name) self.etrPath.set_text(self.image.path) self.etrDescription.set_text(self.image.description) class UsbDevWindow(Window): resource = "usbdev.ui" def __init__(self, usb_devices): Window.__init__(self) self.usb_devices = usb_devices self.tvDevices.set_selection_mode(gtk.SELECTION_MULTIPLE) self.crt.set_property("formatter", string.Formatter()) self.tvcDevs.set_cell_data_func(self.crt, self.crt.set_cell_data) @staticmethod def parse_lsusb(output): for line in output.splitlines(): info = line.split(" ID ")[1] if " " in info: code, descr = info.split(" ", 1) else: code, descr = info, "" yield virtualmachines.UsbDevice(code, descr) @classmethod def show_dialog(cls, gui, usb_devices): def init(output): output = output.strip() logger.info(lsusb_out, out=output) dlg = cls(usb_devices) dlg.lDevs.set_data_source(cls.parse_lsusb(output)) dlg.tvDevices.set_selected_values(usb_devices) dlg.show(gui.wndMain) logger.info(search_usb) d = utils.getProcessOutput("lsusb", env=os.environ) d.addCallback(init) d.addErrback(logger.failure_eb, retr_usb) gui.user_wait_action(d) def on_btnOk_clicked(self, button): self.usb_devices[:] = self.tvDevices.get_selected_values() self.window.destroy() class BaseEthernetDialog(Window): resource = "ethernetdialog.ui" name = "EthernetDialog" def __init__(self, factory, brick): Window.__init__(self) self.factory = factory self.brick = brick def is_valid(self, mac): return tools.mac_is_valid(mac) def setup(self): socks = self.get_object("sock_model") socks.append(("Host-only ad hoc network", virtualmachines.hostonly_sock)) if settings.femaleplugs: socks.append(("Vde socket", "_sock")) for sock in self.factory.socks: socks.append((sock.nickname, sock)) else: for sock in self.factory.socks: if sock.brick.get_type().startswith("Switch"): socks.append((sock.nickname, sock)) def on_randomize_button_clicked(self, button): self.get_object("mac_entry").set_text(tools.random_mac()) def on_EthernetDialog_response(self, dialog, response_id): if response_id == gtk.RESPONSE_OK: combo = self.get_object("sock_combo") sock = combo.get_model().get_value(combo.get_active_iter(), 1) combo = self.get_object("model_combo") model = combo.get_model().get_value(combo.get_active_iter(), 0) mac = self.get_object("mac_entry").get_text() if not self.is_valid(mac): logger.error(invalid_mac, mac=mac) mac = tools.random_mac() self.do(sock, mac, model) dialog.destroy() class AddEthernetDialog(BaseEthernetDialog): def __init__(self, factory, brick, model): BaseEthernetDialog.__init__(self, factory, brick) self.model = model def show(self, parent=None): self.setup() self.get_object("sock_combo").set_active(0) BaseEthernetDialog.show(self, parent) def do(self, sock, mac, model): if sock == "_sock": link = self.brick.add_sock(mac, model) else: link = self.brick.add_plug(sock, mac, model) self.model.append((link, )) class EditEthernetDialog(BaseEthernetDialog): def __init__(self, factory, brick, plug): BaseEthernetDialog.__init__(self, factory, brick) self.plug = plug def show(self, parent=None): self.setup() self.get_object("title_label").set_label( "Edit ethernet interface") self.get_object("ok_button").set_property("label", gtk.STOCK_OK) self.get_object("mac_entry").set_text(self.plug.mac) model = self.get_object("netmodel_model") itr = model.get_iter_first() while itr: if model.get_value(itr, 0) == self.plug.model: self.get_object("model_combo").set_active_iter(itr) break itr = model.iter_next(itr) socks = self.get_object("sock_model") if self.plug.mode == "sock" and settings.femaleplugs: self.get_object("sock_combo").set_active(1) else: itr = socks.get_iter_first() while itr: if self.plug.sock is socks.get_value(itr, 1): self.get_object("sock_combo").set_active_iter(itr) break itr = socks.iter_next(itr) BaseEthernetDialog.show(self, parent) def do(self, sock, mac, model): if sock == "_sock": logger.error(not_implemented) else: if self.plug.configured(): self.plug.disconnect() self.plug.connect(sock) if mac: self.plug.mac = mac if model: self.plug.model = model class ConfirmDialog(Window): resource = "confirmdialog.ui" def __init__(self, question, on_yes=None, on_yes_arg=None, on_no=None, on_no_arg=None, ): Window.__init__(self) self.window.set_markup(question) self.on_yes = on_yes self.on_yes_arg = on_yes_arg self.on_no = on_no self.on_no_arg = on_no_arg def format_secondary_text(self, text): self.window.format_secondary_text(text) def on_ConfirmDialog_response(self, dialog, response_id): if response_id == gtk.RESPONSE_YES and self.on_yes: self.on_yes(self.on_yes_arg) elif response_id == gtk.RESPONSE_NO and self.on_no: self.on_no(self.on_no_arg) dialog.destroy() class NewEventDialog(Window): resource = "newevent.ui" def __init__(self, gui): Window.__init__(self) self.gui = gui def on_delay_entry_key_press_event(self, entry, event): if gtk.gdk.keyval_name(event.keyval) not in VALIDKEY: return True elif gtk.gdk.keyval_name(event.keyval) == "Return": self.window.response(gtk.RESPONSE_OK) return True def on_name_entry_key_press_event(self, entry, event): if gtk.gdk.keyval_name(event.keyval) == "Return": self.window.response(gtk.RESPONSE_OK) return True def get_event_type(self): for name in "start", "stop", "config", "shell", "collation": button = self.get_object(name + "_button") if button.get_active(): return name return "shell" # this condition show not be reached def on_NewEventDialog_response(self, dialog, response_id): try: if response_id == gtk.RESPONSE_OK: name = self.get_object("name_entry").get_text() delay = self.get_object("delay_entry").get_text() type = self.get_event_type() event = self.gui.brickfactory.new_event(name) event.set({"delay": int(delay)}) if type in ("start", "stop", "collation"): action = "off" if type == "stop" else "on" bricks = self.gui.brickfactory.bricks dialog_n = BrickSelectionDialog(event, action, bricks) elif type == "shell": action = console.VbShellCommand("new switch myswitch") event.set({"actions": [action]}) dialog_n = ShellCommandDialog(event) else: raise RuntimeError("Invalid event type %s" % type) dialog_n.show(self.gui.wndMain) finally: dialog.destroy() class BrickSelectionDialog(Window): resource = "brickselection.ui" def __init__(self, event, action, bricks): Window.__init__(self) self._event = event self._action = action self._added = set() self.lBricks.set_data_source(bricks) self.tmfAvl.set_visible_func(self._is_not_added, self._added) self.tmfAdd.set_visible_func(self._is_added, self._added) self.crName1.set_property("formatter", string.Formatter()) self.crName2.set_property("formatter", string.Formatter()) widgets.set_cells_data_func(self.tvcAvailables) widgets.set_cells_data_func(self.tvcAdded) self.tmfAvl.refilter() self.tmfAdd.refilter() @staticmethod def _is_not_added(model, itr, added): brick = model.get_value(itr, 0) return brick and brick not in added @staticmethod def _is_added(model, itr, added): brick = model.get_value(itr, 0) return brick and brick in added def on_add(self, *_): for brick in self.tvAvailables.get_selected_values(): self._added.add(brick) self.tvAvailables.get_model().refilter() self.tvAdded.get_model().refilter() return True def on_remove(self, *_): for brick in self.tvAdded.get_selected_values(): self._added.remove(brick) self.tvAvailables.get_model().refilter() self.tvAdded.get_model().refilter() return True @destroy_on_exit def on_BrickSelectionDialog_response(self, dialog, response_id): if response_id == gtk.RESPONSE_OK: act = self._action actions = ("{0} {1}".format(b.name, act) for b in self._added) self._event.set({"actions": map(console.VbShellCommand, actions)}) logger.info(event_created) class EventControllerMixin(object): resource = "eventconfig.ui" def setup_controller(self, event): self.get_object("action_treeview").get_selection().set_mode( gtk.SELECTION_MULTIPLE) self.get_object("sh_cellrenderer").set_activatable(True) self.get_object("action_cellrenderer").set_property("editable", True) model = self.get_object("actions_liststore") for action in event.config["actions"]: model.append((action, isinstance(action, console.ShellCommand))) model.append(("", False)) def on_action_cellrenderer_edited(self, cell_renderer, path, new_text): model = self.get_object("actions_liststore") iter = model.get_iter(path) if new_text: model.set_value(iter, 0, new_text) if model.iter_next(iter) is None: model.append(("", False)) elif model.iter_next(iter) is not None: model.remove(iter) else: model.set_value(iter, 0, new_text) def on_sh_cellrenderer_toggled(self, cell_renderer, path): model = self.get_object("actions_liststore") model.set_value(model.get_iter(path), 1, not cell_renderer.get_active()) def configure_event(self, event, attrs): model = self.get_object("actions_liststore") f = (console.VbShellCommand, console.ShellCommand) attrs["actions"] = [f[row[1]](row[0]) for row in model if row[0]] event.set(attrs) class ShellCommandDialog(Window, EventControllerMixin): resource = "eventcommand.ui" def __init__(self, event): Window.__init__(self) self.event = event self.setup_controller(event) def on_ShellCommandDialog_response(self, dialog, response_id): if response_id == gtk.RESPONSE_OK: self.configure_event(self.event, {}) dialog.destroy() def disks_of(brick): if brick.get_type() == "Qemu": for dev in "hda", "hdb", "hdc", "hdd", "fda", "fdb", "mtdblock": yield brick.config[dev] class CommitImageDialog(Window): resource = "commitdialog.ui" parent = None _set_label_d = None def __init__(self, progessbar, factory): Window.__init__(self) self.progessbar = progessbar model = self.get_object("model1") for brick in factory.bricks: for disk in (disk for disk in disks_of(brick) if disk.cow): model.append((disk.device + " on " + brick.name, disk)) def show(self, parent=None): self.parent = parent Window.show(self, parent) def _do_image_commit(self, path): def log_err((out, err, exit_status)): if exit_status != 0: logger.error(commit_failed, err=err) d = utils.getProcessOutputAndValue("qemu-img", ["commit", path], os.environ) d.addCallback(log_err) return d def do_image_commit(self, path): self.window.destroy() self.progessbar.wait_for(self._do_image_commit, path) def commit_file(self, pathname): question = ("Warning: the base image will be updated to the\n" "changes contained in the COW. This operation\n" "cannot be undone. Are you sure?") ConfirmDialog(question, on_yes=self.do_image_commit, on_yes_arg=pathname).show(self.parent) def _commit_vm(self, img): logger.warning(not_implemented) # img.VM.commit_disks() self.window.destroy() def commit_vm(self): combobox = self.get_object("disk_combo") model = combobox.get_model() itr = combobox.get_active_iter() if itr: img = model[itr][1] if not self.get_object("cow_checkbutton").get_active(): question = ("Warning: the private COW image will be " "updated.\nThis operation cannot be undone.\n" "Are you sure?") ConfirmDialog(question, on_yes=self._commit_vm, on_yes_arg=img).show(self.parent) else: pathname = os.path.join(img.basefolder, "{0.vm_name}_{0.device}.cow".format(img)) self.commit_file(pathname) else: logger.error(img_invalid) def on_CommitImageDialog_response(self, dialog, response_id): if response_id == gtk.RESPONSE_OK: if self.get_object("file_radiobutton").get_active(): pathname = self.get_object( "cowpath_filechooser").get_filename() self.commit_file(pathname) else: self.commit_vm() else: dialog.destroy() def on_file_radiobutton_toggled(self, button): active = button.get_active() filechooser = self.get_object("cowpath_filechooser") filechooser.set_visible(active) filechooser.unselect_all() combo = self.get_object("disk_combo") combo.set_visible(not active) combo.set_active(-1) self.get_object("cow_checkbutton").set_visible(not active) self.get_object("msg_label").set_visible(False) def _commit_image_show_result(self, (out, err, code)): if code != 0: logger.error(base_not_found, err=err) else: label = self.get_object("msg_label") for line in out.splitlines(): if line.startswith("backing file: "): label.set_text(line) break else: label.set_text(_("Base not found (invalid cow?)")) label.set_visible(True) def on_cowpath_filechooser_file_set(self, filechooser): if self._set_label_d is not None: self._set_label_d.cancel() filename = filechooser.get_filename() if os.access(filename, os.R_OK): code = utils.getProcessOutputAndValue("qemu-img", ["info", filename], os.environ) code.addCallback(self._commit_image_show_result) self._set_label_d = code return code def set_label(self, combobox=None, button=None): if self._set_label_d is not None: self._set_label_d.cancel() if combobox is None: combobox = self.get_object("disk_combo") if button is None: button = self.get_object("cow_checkbutton") label = self.get_object("msg_label") label.set_visible(False) model = combobox.get_model() itr = combobox.get_active_iter() if itr is not None: disk = model[itr][1] base = disk.image and disk.image.path or None if base and button.get_active(): # XXX: make disk.get_real_disk_name's deferred cancellable deferred = disk.get_real_disk_name() deferred.addCallback(label.set_text) deferred.addCallback(lambda _: label.set_visible(True)) deferred.addErrback(logger.failure_eb, img_combo) self._set_label_d = deferred elif base: label.set_visible(True) label.set_text(base) else: label.set_visible(True) label.set_text("base not found") else: label.set_visible(True) label.set_text("base not found") def on_disk_combo_changed(self, combobox): self.set_label(combobox=combobox) def on_cow_checkbutton_toggled(self, button): self.set_label(button=button) def choose_new_image(gui, factory): main = gui.wndMain dialog = gtk.FileChooserDialog(_("Open a disk image"), main, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)) if dialog.run() == gtk.RESPONSE_OK: pathname = dialog.get_filename() LoadImageDialog(factory, pathname).show(main) dialog.destroy() class LoadImageDialog(Window): resource = "loadimagedialog.ui" def __init__(self, factory, pathname): Window.__init__(self) self.pathname = pathname self.factory = factory def show(self, parent=None): name = os.path.basename(self.pathname) self.get_object("name_entry").set_text(name) buf = self.get_object("description_textview").get_buffer() buf.set_text(self.load_desc()) Window.show(self, parent) def load_desc(self): try: with open(self.pathname + ".vbdescr") as fd: return fd.read() except IOError: return "" def on_LoadImageDialog_response(self, dialog, response_id): if response_id == gtk.RESPONSE_OK: name = self.get_object("name_entry").get_text() buf = self.get_object("description_textview").get_buffer() desc = buf.get_text(buf.get_start_iter(), buf.get_end_iter()) try: self.factory.new_disk_image(name, self.pathname, desc) except: dialog.destroy() raise dialog.destroy() class CreateImageDialog(Window): resource = "createimagedialog.ui" def __init__(self, gui, factory): self.gui = gui self.factory = factory Window.__init__(self) def create_image(self, name, pathname, fmt, size, unit): def _create_disk(result): out, err, code = result if code: logger.error(err) else: return self.factory.new_disk_image(name, pathname) exit = utils.getProcessOutputAndValue("qemu-img", ["create", "-f", fmt, pathname, size + unit], os.environ) exit.addCallback(_create_disk) logger.log_failure(exit, img_create_err) return exit def on_CreateImageDialog_response(self, dialog, response_id): if response_id == gtk.RESPONSE_OK: logger.info(img_create) name = self.get_object("name_entry").get_text() if not name: logger.error(img_choose) return folder = self.get_object("folder_filechooserbutton").get_filename() fmt_cmb = self.get_object("format_combobox") itr = fmt_cmb.get_active_iter() if itr: fmt = fmt_cmb.get_model()[itr][0] if fmt == "Auto": fmt = "raw" else: logger.info(img_invalid_type) fmt = "raw" size = str(self.get_object("size_spinbutton").get_value_as_int()) # Get size unit and remove the last character "B" # because qemu-img want k, M, G or T suffixes. unit_cmb = self.get_object("unit_combobox") itr = unit_cmb.get_active_iter() if itr: unit = unit_cmb.get_model()[itr][0][0] else: logger.info(img_invalid_unit) unit = "M" pathname = "%s/%s.%s" % (folder, name, fmt) self.gui.user_wait_action(self.create_image(name, pathname, fmt, size, unit)) dialog.destroy() class SimpleEntryDialog(Window): resource = "simpleentry.ui" name = "SimpleEntryDialog" description = "" def __init__(self, gui): Window.__init__(self) self.gui = gui self.get_object("label1").set_text(self.description) @destroy_on_exit def on_SimpleEntryDialog_response(self, dialog, response_id): if response_id == gtk.RESPONSE_OK: self.do_action(self.get_object("name_entry").get_text()) class NewProjectDialog(SimpleEntryDialog): @property def description(self): return _("Project name") def do_action(self, name): self.gui.on_new(name) class ListProjectsDialog(Window): resource = "listprojects.ui" name = "ListProjectsDialog" title = "" def show(self, parent=None): self.populate(self.get_projects()) if self.title: self.window.set_title(self.title) Window.show(self, parent) def get_projects(self): return (prj.name for prj in project.manager) def populate(self, projects): model = self.get_object("liststore1") for prj in projects: model.append((prj, )) def get_project_name(self): treeview = self.get_object("treeview") model, itr = treeview.get_selection().get_selected() if itr: return model.get_value(itr, 0) def on_treeview_row_activated(self, treeview, path, column): model = treeview.get_model() itr = model.get_iter(path) if itr: name = model.get_value(itr, 0) self.do_action(self.window, gtk.RESPONSE_OK, name) return True def on_ListProjectsDialog_response(self, dialog, response_id): if response_id == gtk.RESPONSE_OK: name = self.get_project_name() if name is not None: self.do_action(dialog, response_id, name) else: dialog.destroy() return True def do_action(self, dialog, response_id, name): pass class _ListProjectAbstract(ListProjectsDialog): def __init__(self, gui): self.gui = gui Window.__init__(self) def get_projects(self): curr = project.manager.current return (prj.name for prj in project.manager if prj != curr) class OpenProjectDialog(_ListProjectAbstract): @property def title(self): return _("Virtualbricks - Open project") @destroy_on_exit def do_action(self, dialog, response_id, name): self.gui.on_open(name) class DeleteProjectDialog(_ListProjectAbstract): @property def title(self): return _("Virtualbricks - Delete project") @destroy_on_exit def do_action(self, dialog, response_id, name): project.manager.get_project(name).delete() class RenameProjectDialog(SimpleEntryDialog): @property def description(self): return _("New project name") def do_action(self, name): project.manager.current.rename(name) def has_cow(disk): return disk.image and disk.cow def cowname(brick, disk): return os.path.join(project.manager.current.path, "{0.name}_{1.device}.cow".format(brick, disk)) def gather_selected(model, parent, workspace, lst): itr = model.iter_children(parent) while itr: fp = model[itr][FILEPATH] if model[itr][SELECTED] and fp.isfile(): lst.append(os.path.join(*fp.segmentsFrom(workspace))) else: gather_selected(model, itr, workspace, lst) itr = model.iter_next(itr) class ImportCanceled(Exception): pass SELECTED, ACTIVABLE, TYPE, NAME, FILEPATH = range(5) def ConfirmOverwriteDialog(fp, parent): question = _("A file named \"{0}\" already exists. Do you want to " "replace it?").format(fp.basename()) dialog = gtk.MessageDialog(parent, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_QUESTION, message_format=question) dialog.format_secondary_text(_("The file already exists in \"{0}\". " "Replacing it will overwrite its " "contents.").format(fp.dirname())) dialog.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL) button = gtk.Button(_("_Replace")) button.set_can_default(True) button.set_image(gtk.image_new_from_stock(gtk.STOCK_SAVE_AS, gtk.ICON_SIZE_BUTTON)) button.show() dialog.add_action_widget(button, gtk.RESPONSE_ACCEPT) dialog.set_default_response(gtk.RESPONSE_ACCEPT) return dialog class ExportProjectDialog(Window): resource = "exportproject.ui" include_images = False def __init__(self, progressbar, prjpath, disk_images): super(Window, self).__init__() self.progressbar = progressbar if isinstance(prjpath, basestring): prjpath = filepath.FilePath(prjpath) self.prjpath = prjpath self.image_files = [(image.name, filepath.FilePath(image.path)) for image in disk_images] # self.image_files = set(filepath.FilePath(image.path) for image in # disk_images) self.required_files = set([prjpath.child(".project"), prjpath.child("README")]) self.internal_files = set([prjpath.child("vde.dot"), prjpath.child("vde_topology.plain"), prjpath.child(".images")]) def append_dirs(self, dirpath, dirnames, model, parent, nodes): for dirname in sorted(dirnames): child = dirpath.child(dirname) if child in self.required_files | self.internal_files: dirnames.remove(dirname) else: row = (True, True, gtk.STOCK_DIRECTORY, dirname, child) nodes[child.path] = model.append(parent, row) def append_files(self, dirpath, filenames, model, parent): for filename in sorted(filenames): child = dirpath.child(filename) if (child not in self.required_files | self.internal_files and child.isfile() and not child.islink()): row = (True, True, gtk.STOCK_FILE, filename, child) model.append(parent, row) def build_path_tree(self, model, prjpath): row = (True, True, gtk.STOCK_DIRECTORY, prjpath.basename(), prjpath) root = model.append(None, row) nodes = {prjpath.path: root} for dirpath, dirnames, filenames in os.walk(prjpath.path): parent = nodes[dirpath] dp = filepath.FilePath(dirpath) self.append_dirs(dp, dirnames, model, parent, nodes) self.append_files(dp, filenames, model, parent) def show(self, parent_w=None): model = self.get_object("treestore1") self.build_path_tree(model, self.prjpath) pixbuf_cr = self.get_object("icon_cellrenderer") pixbuf_cr.set_property("stock-size", gtk.ICON_SIZE_MENU) size_c = self.get_object("treeviewcolumn2") size_cr = self.get_object("size_cellrenderer") size_c.set_cell_data_func(size_cr, self._set_size) self.get_object("selected_cellrenderer").connect( "toggled", self.on_selected_cellrenderer_toggled, model) self.get_object("treeview1").expand_row(0, False) Window.show(self, parent_w) def _set_size(self, column, cellrenderer, model, itr): fp = model.get_value(itr, FILEPATH) if fp.isfile(): cellrenderer.set_property("text", tools.fmtsize(fp.getsize())) else: size = self._calc_size(model, itr) if model.get_path(itr) == (0,): size += sum(fp.getsize() for fp in self.required_files if fp.exists()) if self.include_images: size += sum(fp.getsize() for n, fp in self.image_files) cellrenderer.set_property("text", tools.fmtsize(size)) def _calc_size(self, model, parent): size = 0 fp = model[parent][FILEPATH] if fp.isdir(): itr = model.iter_children(parent) while itr: size += self._calc_size(model, itr) itr = model.iter_next(itr) elif model[parent][SELECTED]: size += fp.getsize() return size def _normalize_filename(self, filename): if filename[-4:] != ".vbp": return filename + ".vbp" return filename def on_selected_cellrenderer_toggled(self, cellrenderer, path, model): itr = model.get_iter(path) model[itr][SELECTED] = not model[itr][SELECTED] self._select_children(model, itr, model[itr][SELECTED]) parent = model.iter_parent(itr) while parent: child = model.iter_children(parent) while child: if not model[child][SELECTED]: model[parent][SELECTED] = False break child = model.iter_next(child) else: model[parent][SELECTED] = True parent = model.iter_parent(parent) def _select_children(self, model, parent, selected): itr = model.iter_children(parent) while itr: self._select_children(model, itr, selected) model[itr][SELECTED] = selected itr = model.iter_next(itr) @destroy_on_exit def on_filechooser_response(self, dialog, response_id): if response_id == gtk.RESPONSE_OK: filename = dialog.get_filename() if filename is None: self.get_object("export_button").set_sensitive(False) elif os.path.exists(filename) and not os.path.isfile(filename): dialog.unselect_all() self.get_object("export_button").set_sensitive(False) else: filename = self._normalize_filename(filename) txt = filename.decode(sys.getfilesystemencoding()).encode( "utf8") self.get_object("filename_entry").set_text(txt) self.get_object("export_button").set_sensitive(True) def on_open_button_clicked(self, button): chooser = gtk.FileChooserDialog(title=_("Export project"), action=gtk.FILE_CHOOSER_ACTION_SAVE, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) vbp = gtk.FileFilter() vbp.add_pattern("*.vbp") chooser.set_filter(vbp) chooser.connect("response", self.on_filechooser_response) chooser.set_transient_for(self.window) chooser.set_current_name(self.get_object("filename_entry").get_text()) chooser.show() def on_filename_entry_changed(self, entry): self.get_object("export_button").set_sensitive(bool(entry.get_text())) def on_include_images_checkbutton_toggled(self, checkbutton): self.include_images = checkbutton.get_active() model = self.get_object("treestore1") model.row_changed((0,), model.get_iter((0,))) def export(self, model, ancestor, filename, export=project.manager.export): files = [] gather_selected(model, model.get_iter_first(), ancestor, files) for fp in self.required_files: if fp.exists(): files.append(os.path.join(*fp.segmentsFrom(ancestor))) images = [] if self.include_images: images = [(name, fp.path) for name, fp in self.image_files] return export(filename, files, images) @destroy_on_exit def on_confirm_response(self, dialog, response_id, parent, filename): if response_id == gtk.RESPONSE_ACCEPT: parent.destroy() self.do_export(filename) def do_export(self, filename): model = self.get_object("treestore1") ancestor = filepath.FilePath(settings.VIRTUALBRICKS_HOME) self.progressbar.wait_for(self.export(model, ancestor, filename)) def on_ExportProjectDialog_response(self, dialog, response_id): if response_id == gtk.RESPONSE_OK: filename = self._normalize_filename(self.get_object( "filename_entry").get_text()) fp = filepath.FilePath(filename) if fp.exists(): cdialog = ConfirmOverwriteDialog(fp, dialog) cdialog.connect("response", self.on_confirm_response, dialog, fp.path) cdialog.show() else: dialog.destroy() self.do_export(fp.path) else: dialog.destroy() def retrieve_data(widget, data): lst, name = data attr = widget.get_data(name) if attr is not None: lst.append((attr, widget)) def accumulate_data(container, name): lst = [] container.foreach(retrieve_data, (lst, name)) return lst def pass_through(function, *args, **kwds): def wrapper(arg): function(*args, **kwds) return arg return wrapper def iter_model(model, *columns): itr = model.get_iter_root() if not columns: columns = range(model.get_n_columns()) while itr: yield model.get(itr, *columns) itr = model.iter_next(itr) def complain_on_error(result): out, err, code = result if code != 0: logger.warn(err) raise error.ProcessTerminated(code) logger.info(err) return result def _set_path(column, cell_renderer, model, iter, colid): path = model.get_value(iter, colid) cell_renderer.set_property("text", path.path if path else "") def _set_path_remap(column, cell_renderer, model, iter, colid): path = model.get_value(iter, colid) if path: cell_renderer.set_properties(font_desc=None, foreground=None, text=path.path) else: font = pango.FontDescription() font.set_style(pango.STYLE_ITALIC) cell_renderer.set_properties(font_desc=font, foreground="gray", text="(Click here to select an image)") class Freezer: def __init__(self, freeze, unfreeze, parent): self.freeze = freeze self.unfreeze = unfreeze builder = gtk.Builder() res = graphics.get_data_filename("userwait.ui") builder.add_from_file(res) self.progressbar = builder.get_object("progressbar") self.window = builder.get_object("UserWaitWindow") self.window.set_transient_for(parent) self.window.set_modal(True) def wait_for(self, something, *args): if isinstance(something, defer.Deferred): return self.wait_for_deferred(something) elif hasattr(something, "__call__"): return self.wait_for_action(something, *args) raise RuntimeError("Invalid argument") def wait_for_action(self, action, *args): done = defer.maybeDeferred(action, *args) return self.wait_for_deferred(done) def wait_for_deferred(self, deferred): deferred.addBoth(self.stop, self.start()) return deferred def start(self): self.freeze() self.window.show_all() lc = task.LoopingCall(self.progressbar.pulse) lc.start(0.2, False) return lc def stop(self, passthru, lc): self.window.destroy() self.unfreeze() lc.stop() return passthru class ProgressBar: def __init__(self, dialog): self.freezer = Freezer(lambda: None, lambda: None, dialog) def wait_for(self, something, *args): return self.freezer.wait_for(something, *args) def all_paths_set(model): return all(path for (path,) in iter_model(model, 1)) class _HumbleImport: def step_1(self, dialog, model, path, extract=project.manager.import_prj): archive_path = dialog.get_archive_path() if archive_path != dialog.archive_path: if dialog.project: dialog.project.delete() dialog.archive_path = archive_path d = extract(filepath._secureEnoughString(), archive_path) d.addCallback(self.extract_cb, dialog) d.addCallback(self.fill_model_cb, dialog, model, path) d.addErrback(self.extract_eb, dialog) return d def extract_cb(self, project, dialog): logger.debug(project_extracted, path=project.path) dialog.project = project dialog.images = dict((name, section["path"]) for (_, name), section in project.get_descriptor().get_images()) return project def extract_eb(self, fail, dialog): logger.failure(extract_err, fail) dialog.destroy() return fail def fill_model_cb(self, project, dialog, model, vipath): model.clear() for name in project.images(): if name in dialog.images: fp = vipath.child(os.path.basename(dialog.images[name])) else: fp = vipath.child(name) fp2 = filepath.FilePath(fp.path) c = 1 while fp2.exists(): fp2 = fp.siblingExtension(".{0}".format(c)) c += 1 model.append((name, fp2, True)) return project def step_2(self, dialog, store1, store2): """Step 2: map images.""" imgs = dict((name, path) for name, path, save in iter_model(store1) if save) store2.clear() for name in dialog.images: store2.append((name, imgs.get(name))) if len(store2) == 0 or all_paths_set(store2): dialog.set_page_complete() def step_3(self, dialog): w = dialog.get_object w("projectname_label").set_text(dialog.get_project_name()) path_label = w("projectpath_label") fp = filepath.FilePath(dialog.project.path) path = fp.sibling(dialog.get_project_name()).path path_label.set_text(path) path_label.set_tooltip_text(path) w("open_label").set_text(str(dialog.get_open())) w("overwrite_label").set_text(str(dialog.get_overwrite())) iimgs = (name for name, s in iter_model(w("liststore1"), 0, 2) if s) w("imported_label").set_text("\n".join(iimgs)) store = w("liststore2") vbox = w("vbox1") vbox.foreach(vbox.remove) for i, (name, dest) in enumerate(iter_model(store)): nlabel = gtk.Label(name + ":") nlabel.set_alignment(0.0, 0.5) dlabel = gtk.Label(dest.path) dlabel.set_tooltip_text(dest.path) dlabel.set_alignment(0.0, 0.5) dlabel.set_ellipsize(pango.ELLIPSIZE_MIDDLE) box = gtk.HBox(spacing=5) box.pack_start(nlabel, False, True, 0) box.pack_start(dlabel, True, True, 0) vbox.pack_start(box, False, True, 3) box.show_all() def apply(self, project, name, factory, overwrite, open, store1, store2): entry = project.get_descriptor() imgs = self.get_images(project, entry, store1, store2) deferred = self.rebase_all(project, imgs, entry) deferred.addCallback(self.check_rebase) deferred.addCallback(lambda a: project.rename(name, overwrite)) if open: deferred.addCallback(pass_through(project.open, factory)) deferred.addErrback(pass_through(project.delete)) logger.log_failure(deferred, error_on_import_project) return deferred def get_images(self, project, entry, store1, store2): imagesfp = filepath.FilePath(project.path).child(".images") imgs = self.save_images(store1, imagesfp) self.remap_images(entry, store2, imgs) entry.save(project) return imgs def save_images(self, model, source): saved = {} for name, destination, save in iter_model(model): if save: fp = source.child(name) try: fp.moveTo(destination) except OSError as e: if e.errno == errno.ENOENT: logger.error(image_not_exists, source=fp.path, destination=destination.path) continue else: raise else: saved[name] = destination return saved def remap_images(self, entry, store, saved): for name, destination in saved.iteritems(): entry.remap_image(name, destination.path) for name, path in iter_model(store): entry.remap_image(name, path.path) saved[name] = path def rebase_all(self, project, images, entry): lst = [] for name, path in images.iteritems(): for vmname, dev in entry.device_for_image(name): cow_name = "{0}_{1}.cow".format(vmname, dev) cow = filepath.FilePath(project.path).child(cow_name) if cow.exists(): logger.debug(log_rebase, cow=cow.path, basefile=path.path) lst.append(self.rebase(path.path, cow.path)) return defer.DeferredList(lst) def rebase(self, backing_file, cow, run=utils.getProcessOutputAndValue): args = ["rebase", "-u", "-b", backing_file, cow] d = run("qemu-img", args, os.environ) return d.addCallback(complain_on_error) def check_rebase(self, result): for success, status in result: if not success: logger.error(rebase_error, log_failure=status) class ImportDialog(Window): resource = "importdialog.ui" NAME, PATH, SELECTED = range(3) archive_path = None project = None images = None humble = _HumbleImport() def __init__(self, factory): Window.__init__(self) self.factory = factory @property def assistant(self): return self.builder.get_object("ImportDialog") def show(self, parent=None): col1 = self.get_object("pathcolumn1") cell1 = self.get_object("cellrenderertext2") col1.set_cell_data_func(cell1, _set_path, 1) col2 = self.get_object("pathcolumn2") cell2 = self.get_object("cellrenderertext4") col2.set_cell_data_func(cell2, _set_path_remap, 1) view1 = self.get_object("treeview1") view1.connect("button_press_event", self.on_button_press_event, col1, self.get_save_filechooserdialog) view2 = self.get_object("treeview2") view2.connect("button_press_event", self.on_button_press_event, col2, self.get_map_filechooserdialog) Window.show(self, parent) def destroy(self): self.assistant.destroy() # assistant method helpers def set_page_complete(self, page=None, complete=True): if page is None: page = self.assistant.get_nth_page( self.assistant.get_current_page()) self.assistant.set_page_complete(page, complete) #### def get_project_name(self): return self.get_object("prjname_entry").get_text() def set_project_name(self, name): self.get_object("prjname_entry").set_text(name) def get_archive_path(self): return self.get_object("filechooserbutton").get_filename() def get_open(self): return self.get_object("opencheckbutton").get_active() def get_overwrite(self): return self.get_object("overwritecheckbutton").get_active() def get_filechooserdialog(self, model, path, title, action, stock_id): chooser = gtk.FileChooserDialog(title, self.window, action, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, stock_id, gtk.RESPONSE_OK)) chooser.set_modal(True) chooser.set_select_multiple(False) chooser.set_transient_for(self.window) chooser.set_destroy_with_parent(True) chooser.set_position(gtk.WIN_POS_CENTER) chooser.set_do_overwrite_confirmation(True) chooser.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG) chooser.connect("response", self.on_filechooserdialog_response, model, path) return chooser def get_save_filechooserdialog(self, model, path): return self.get_filechooserdialog(model, path, _("Save image as..."), gtk.FILE_CHOOSER_ACTION_SAVE, gtk.STOCK_SAVE) def get_map_filechooserdialog(self, model, path): return self.get_filechooserdialog(model, path, _("Map image as..."), gtk.FILE_CHOOSER_ACTION_OPEN, gtk.STOCK_OPEN) # callbacks def on_liststore2_row_changed(self, model, path, iter): self.set_page_complete(complete=all_paths_set(model)) def on_ImportDialog_prepare(self, assistant, page): page_num = assistant.get_current_page() if page_num == 0: pass elif page_num == 1: ws = settings.get("workspace") deferred = self.humble.step_1(self, self.get_object("liststore1"), filepath.FilePath(ws).child("vimages")) if deferred: ProgressBar(self.assistant).wait_for(deferred) elif page_num == 2: self.humble.step_2(self, self.get_object("liststore1"), self.get_object("liststore2")) elif page_num == 3: self.humble.step_3(self) else: logger.error(invalid_step_assitant, num=page_num) return True def on_ImportDialog_cancel(self, assistant): if self.project: logger.info(removing_temporary_project, path=self.project.path) self.project.delete() assistant.destroy() return True def on_ImportDialog_apply(self, assistant): deferred = self.humble.apply(self.project, self.get_project_name(), self.factory, self.get_overwrite(), self.get_open(), self.get_object("liststore1"), self.get_object("liststore2")) ProgressBar(assistant).wait_for(deferred) return True def on_ImportDialog_close(self, assistant): assistant.destroy() return True def on_filechooserbutton_file_set(self, filechooser): filename = filechooser.get_filename() name = os.path.splitext(os.path.basename(filename))[0] if not self.get_project_name(): self.set_project_name(name) return True def on_prjname_entry_changed(self, entry): self.set_import_sensitive(self.get_archive_path(), entry.get_text(), self.get_object("overwritecheckbutton")) return True def on_overwritecheckbutton_toggled(self, checkbutton): self.set_import_sensitive(self.get_archive_path(), self.get_object("prjname_entry").get_text(), checkbutton) return True def set_import_sensitive(self, filename, name, overwrite_btn): page = self.get_object("intro_page") label = self.get_object("warn_label") if name in list(prj.name for prj in project.manager): overwrite_btn.set_visible(True) overwrite = overwrite_btn.get_active() label.set_visible(not overwrite) self.set_page_complete(page, overwrite) else: overwrite_btn.set_active(False) overwrite_btn.set_visible(False) label.set_visible(False) if filename and name: self.set_page_complete(page, True) else: self.set_page_complete(page, False) def on_cellrenderertoggle1_toggled(self, renderer, path): model = self.get_object("liststore1") active = renderer.get_active() model.set(model.get_iter(path), self.SELECTED, not active) return True def on_button_press_event(self, treeview, event, column, dialog_factory): if event.button == 1: x = int(event.x) y = int(event.y) pthinfo = treeview.get_path_at_pos(x, y) if pthinfo is not None and pthinfo[1] is column: path, col = pthinfo[:2] treeview.grab_focus() treeview.set_cursor(path, col, 0) model = treeview.get_model() chooser = dialog_factory(model, path) itr = model.get_iter(path) filename = model.get_value(itr, self.PATH) if filename is not None: if not chooser.set_filename(filename.path): chooser.set_current_name(filename.basename()) chooser.show() return True def on_filechooserdialog_response(self, dialog, response_id, model, path): if response_id == gtk.RESPONSE_OK: filename = dialog.get_filename() if filename is not None: model.set_value(model.get_iter(path), self.PATH, filepath.FilePath(filename)) dialog.destroy() return True class SaveAsDialog(Window): resource = "saveas.ui" home = filepath.FilePath(settings.DEFAULT_HOME) def __init__(self, factory, projects): Window.__init__(self) self.factory = factory self.model = model = self.get_object("liststore1") for prj in projects: model.append((prj, )) def get_project_name(self): return self.get_object("name_entry").get_text() def set_invalid(self, invalid): self.get_object("ok_button").set_sensitive(not invalid) def on_name_entry_changed(self, entry): name = entry.get_text() try: self.home.child(name) except filepath.InsecurePath: self.set_invalid(True) else: model = self.model itr = model.get_iter_root() while itr: if model.get_value(itr, 0) == name: self.set_invalid(True) break itr = model.iter_next(itr) else: self.set_invalid(False) @destroy_on_exit def on_response(self, dialog, response_id): if response_id == gtk.RESPONSE_OK: project.manager.current.save_as(self.get_project_name(), self.factory) class RenameDialog(Window): resource = "renamedialog.ui" name = "RenameDialog" def __init__(self, original, checker=None): Window.__init__(self) self.original = original entry = self.get_entry() entry.set_text(original.name) if checker: self.set_sensitive(False) entry.connect("changed", self.on_changed, checker) def get_entry(self): return self.get_object("name_entry") def set_sensitive(self, sensitive): self.get_object("ok_button").set_sensitive(sensitive) def get_name(self): return self.get_entry().get_text() def on_changed(self, entry, check): try: check(self.get_name()) self.set_sensitive(True) except errors.InvalidNameError: self.set_sensitive(False) @destroy_on_exit def on_RenameDialog_response(self, dialog, response_id): if response_id == gtk.RESPONSE_OK: name = self.get_name() try: self.rename(name) except errors.InvalidNameError: logger.error(invalid_name, name=name) def rename(self, name): self.original.rename(name) class RenameBrickDialog(RenameDialog): def rename(self, name): old = self.original.name self.original.rename(name) regex = re.compile("^{0}_([a-z0-9]+).cow$".format(old)) new = r"{0}_\1.cow".format(self.original.name) for fp in filepath.FilePath(project.manager.current.path).children(): if fp.isfile() and regex.match(fp.basename()): fp.moveTo(fp.sibling(regex.sub(new, fp.basename()))) class NewBrickDialog(Window): resource = "newbrick.ui" _type = "Switch" def __init__(self, factory): Window.__init__(self) self.factory = factory def on_BrickType_toggled(self, radiobutton): self._type = gtk.Buildable.get_name(radiobutton)[2:] return True @destroy_on_exit def on_NewBrickDialog_response(self, dialog, response_id): if response_id == gtk.RESPONSE_OK: name = self.etrName.get_text() try: self.factory.new_brick(self._type, name) except errors.InvalidNameError: logger.error(brick_invalid_name) else: logger.debug(created) return True class SettingsDialog(Window): resource = "settings.ui" def __init__(self, gui): Window.__init__(self) self.gui = gui # general self.etrTerm.set_text(settings.get("term")) self.etrSudo.set_text(settings.get("sudo")) self.cbSystray.set_active(settings.get("systray")) self.cbShowMissing.set_active(settings.get("show_missing")) # vde self.fcbVdepath.set_current_folder(settings.get("vdepath")) self.cbPython.set_active(settings.get("python")) self.cbFemaleplugs.set_active(settings.get("femaleplugs")) self.cbErroronloop.set_active(settings.get("erroronloop")) # qemu/kvm self.fcbQemupath.set_current_folder(settings.get("qemupath")) self.lFormats.set_data_source(["cow", "qcow", "qcow2"]) self.cbCowfmt.set_selected_value(settings.get("cowfmt")) self.cbCowfmt.set_cell_data_func(self.crt1, self.crt1.set_cell_data) self.cbKsm.set_active(settings.get("ksm")) self.cbKsm.set_sensitive(tools.check_ksm()) self.cbKvm.set_active(settings.get("kvm")) self.cbKvm.set_sensitive(tools.check_kvm(settings.get("qemupath"))) self.cbKqemu.set_active(settings.get("kqemu")) def on_fcbVdepath_selection_changed(self, filechooser): newpath = filechooser.get_filename() missing = tools.check_missing_vde(newpath) if not os.access(newpath, os.X_OK): text = '{0}:\n{1}'.format( _("Error"), _("invalid path for vde binaries")) elif len(missing) > 0: text = '{0}:\n'.format( _("Warning, missing modules")) for l in missing: text += l + "\n" else: text = '{0}.\n'.format( _("All VDE components detected")) self.lblVdepath.set_markup(text) def on_fcbQemupath_selection_changed(self, filechooser): newpath = filechooser.get_filename() missing_qemu = missing_kvm = False missing, found = tools.check_missing_qemu(newpath) if "qemu" in missing: missing_qemu = True if "kvm" in missing: missing_kvm = True if not os.access(newpath, os.X_OK): text = '{0}:\n{1}'.format( _("Error"), _("invalid path for qemu binaries")) elif missing_qemu and missing_kvm: text = '{0}:\n{1}'.format( _("Error"), _("cannot find neither qemu nor kvm in this path")) else: if missing_qemu: text = '{0}:\n{1}'.format( _("Warning"), _("cannot find qemu, using kvm only")) elif missing_kvm: text = '{0}:\n{1}. {2}.\n'.format( _("Warning"), _("kvm not found"), _("KVM support disabled")) else: text = '{0}.\n'.format( _("KVM and Qemu detected")) arch = [] for f in found: if f.startswith("qemu-system-"): arch.append(f[12:]) if arch: text += "{0}:\n{1}".format(_("additional targets supported"), textwrap.fill(" ".join(arch), 30)) self.lblQemupath.set_markup(text) def on_SettingsDialog_response(self, dialog, response_id): if response_id in (gtk.RESPONSE_APPLY, gtk.RESPONSE_OK): logger.debug(apply_settings) # general settings.set("term", self.etrTerm.get_text()) settings.set("sudo", self.etrSudo.get_text()) settings.set("systray", self.cbSystray.get_active()) settings.set("show_missing", self.cbShowMissing.get_active()) # vde settings.set('vdepath', self.fcbVdepath.get_current_folder()) settings.set("python", self.cbPython.get_active()) settings.set("femaleplugs", self.cbFemaleplugs.get_active()) settings.set("erroronloop", self.cbErroronloop.get_active()) # qemu/kvm settings.set('qemupath', self.fcbQemupath.get_current_folder()) settings.set("cowfmt", self.cbCowfmt.get_selected_value()) settings.set("ksm", self.cbKsm.get_active()) settings.set("kvm", self.cbKvm.get_active()) settings.set("kqemu", self.cbKqemu.get_active()) tools.enable_ksm(self.cbKsm.get_active(), settings.get("sudo")) if self.cbSystray.get_active(): self.gui.start_systray() else: self.gui.stop_systray() if response_id == gtk.RESPONSE_APPLY: return dialog.destroy() class AttachEventDialog(Window): resource = "attachevent.ui" def __init__(self, brick, factory): Window.__init__(self) self.brick = brick events = (e for e in factory.events if e.configured()) self.lEvents.set_data_source(events) # event start event_start = factory.get_event_by_name(brick.get("pon_vbevent")) self.tvStart.set_selected_value(event_start) self.tvStart.set_cells_data_func() # event stop event_stop = factory.get_event_by_name(brick.get("poff_vbevent")) self.tvStop.set_selected_value(event_stop) self.tvStop.set_cells_data_func() def on_btnStartSelClear_clicked(self, button): self.tvStart.set_selected_value(widgets.SELECT_NONE) return True def on_btnStopSelClear_clicked(self, button): self.tvStop.set_selected_value(widgets.SELECT_NONE) return True def on_treeview_button_press_event(self, treeview, event): if event.button == 1: path = treeview.get_path_at_pos(int(event.x), int(event.y)) if path is None: treeview.set_selected_value(widgets.SELECT_NONE) return True @destroy_on_exit def on_AttachEventDialog_response(self, dialog, response_id): if response_id == gtk.RESPONSE_OK: event_start = self.tvStart.get_selected_value() event_stop = self.tvStop.get_selected_value() cfg = { "pon_vbevent": event_start.name if event_start else "", "poff_vbevent": event_stop.name if event_stop else "", } self.brick.set(cfg) return True virtualbricks-1.0.2/virtualbricks/gui/graphics.py000066400000000000000000000162201262207653100222250ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_graphics -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import os.path import sys import re import pkgutil from pkgutil import get_data import shutil import Image import pygraphviz as pgv import gtk.gdk from virtualbricks.tools import is_running __all__ = ["get_filename", "get_data", "get_image", "pixbuf_for_brick", "pixbuf_for_brick_at_size", "pixbuf_for_brick_type", "pixbuf_for_running_brick", "pixbuf_for_running_brick_at_size", "Node", "Topology", "get_data_filename"] def get_data_filename(resource): syswide = os.path.join(sys.prefix, "share", "virtualbricks", resource) if os.path.exists(syswide): return syswide return get_filename("virtualbricks.gui", os.path.join("data", resource)) def get_filename(package, resource): loader = pkgutil.get_loader(package) mod = sys.modules.get(package) or loader.load_module(package) if mod is None or not hasattr(mod, "__file__"): return None parts = resource.split("/") parts.insert(0, os.path.dirname(mod.__file__)) return os.path.join(*parts) def get_image(name): return get_data_filename(name) def has_custom_icon(brick): return "icon" in brick.config and brick.config["icon"] def brick_icon(brick): if has_custom_icon(brick): return brick.config["icon"] else: return get_data_filename(brick.get_type().lower() + ".png") def saturate_if_stopped(brick, pixbuf): if not is_running(brick): pixbuf.saturate_and_pixelate(pixbuf, 0.0, True) return pixbuf def pixbuf_for_brick_at_size(brick, width, height): filename = brick_icon(brick) pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(filename, width, height) return saturate_if_stopped(brick, pixbuf) def pixbuf_for_brick(brick): filename = brick_icon(brick) pixbuf = gtk.gdk.pixbuf_new_from_file(filename) return saturate_if_stopped(brick, pixbuf) def pixbuf_for_brick_type(type): filename = get_data_filename("%s.png" % type.lower()) if filename is None: return None return gtk.gdk.pixbuf_new_from_file(filename) def pixbuf_for_running_brick(brick): return gtk.gdk.pixbuf_new_from_file(brick_icon(brick)) def pixbuf_for_running_brick_at_size(brick, witdh, height): return gtk.gdk.pixbuf_new_from_file_at_size(brick_icon(brick), witdh, height) class Node: def __init__(self, topology, name, x, y, thresh=50): self.x = x self.y = y self.thresh = thresh self.name = name self.parent = topology def here(self, x, y): return (abs(x + self.parent.x_adj - self.x) < self.thresh and abs(y + self.parent.y_adj - self.y) < self.thresh) class Topology: def __init__(self, widget, bricks, scale=1.00, orientation="LR", tempdir="/tmp"): self.topowidget = widget self.tempdir = tempdir self.topo = pgv.AGraph() self.topo.graph_attr['rankdir'] = orientation self.topo.graph_attr['ranksep'] = '2.0' self.nodes = [] self.x_adj = 0.0 self.y_adj = 0.0 # Add nodes sg = self.topo.add_subgraph([], name="switches_rank") sg.graph_attr['rank'] = 'same' for brick in bricks: self.topo.add_node(brick.name) n = self.topo.get_node(brick.name) n.attr['shape'] = 'none' n.attr['fontsize'] = '9' n.attr['image'] = brick_icon(brick) for b in bricks: loop = 0 for e in b.plugs: if e.sock is not None: if b.get_type() == 'Tap': self.topo.add_edge(b.name, e.sock.brick.name) e = self.topo.get_edge(b.name, e.sock.brick.name) elif len(b.plugs) == 2: if loop == 0: self.topo.add_edge(e.sock.brick.name, b.name) e = self.topo.get_edge(e.sock.brick.name, b.name) else: self.topo.add_edge(b.name, e.sock.brick.name) e = self.topo.get_edge(b.name, e.sock.brick.name) elif loop < (len(b.plugs) + 1) / 2: self.topo.add_edge(e.sock.brick.name, b.name) e = self.topo.get_edge(e.sock.brick.name, b.name) else: self.topo.add_edge(b.name, e.sock.brick.name) e = self.topo.get_edge(b.name, e.sock.brick.name) loop += 1 e.attr['dir'] = 'none' e.attr['color'] = 'black' e.attr['name'] = " " e.attr['decorate'] = 'true' #draw and save self.topo.write(self.get_topo_filename()) self.topo.layout('dot') self.topo.draw(self.get_image_filename()) self.topo.draw(self.get_plain_filename()) img = Image.open(self.get_image_filename()) x_siz, y_siz = img.size for line in open(self.get_plain_filename()).readlines(): arg = re.split('\s+', line.rstrip('\n')) if arg[0] == 'graph': if float(arg[2]) != 0 and float(arg[3]) != 0: x_fact = scale * (x_siz / float(arg[2])) y_fact = scale * (y_siz / float(arg[3])) else: x_fact = 1 y_fact = 1 elif arg[0] == 'node': if float(arg[2]) != 0 and float(arg[3] != 0): x = scale * (x_fact * float(arg[2])) y = scale * (y_siz - y_fact * float(arg[3])) else: x = scale * (x_fact) y = scale * (y_siz - y_fact) self.nodes.append(Node(self, arg[1], x, y)) # Display on the widget if scale < 1.00: img.resize((x_siz * scale, y_siz * scale)) img.save(self.get_image_filename()) self.topowidget.set_from_file(self.get_image_filename()) def export(self, filename): shutil.copy(self.get_image_filename(), filename) def get_image_filename(self): return os.path.join(self.tempdir, "vde_topology.png") def get_plain_filename(self): return os.path.join(self.tempdir, "vde_topology.plain") def get_topo_filename(self): return os.path.join(self.tempdir, "vde.dot") virtualbricks-1.0.2/virtualbricks/gui/gui.py000066400000000000000000002431761262207653100212250ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_gui -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import sys import string import gobject import gtk from twisted.internet import error, defer, task, protocol, reactor, utils from twisted.python import filepath from zope.interface import implementer from virtualbricks.interfaces import registerAdapter from virtualbricks.gui.interfaces import (IMenu, IJobMenu, IConfigController, IPrerequisite, IState, IControl, IStateManager) from virtualbricks.bricks import Brick from virtualbricks.events import Event from virtualbricks.link import Plug, Sock from virtualbricks.virtualmachines import VirtualMachine from virtualbricks import tools, settings, project, log, brickfactory, qemu from virtualbricks.tools import dispose, is_running from virtualbricks.gui import graphics, dialogs, widgets, help if False: # pyflakes _ = str logger = log.Logger() sync_error = log.Event("Sync terminated unexpectedly") create_image_error = log.Event("Create image terminated unexpectedly") drawing_topology = log.Event("drawing topology") top_invalid_format = log.Event("Error saving topology: Invalid image format") top_write_error = log.Event("Error saving topology: Could not write file") top_unknown = log.Event("Error saving topology: Unknown error") start_virtualbricks = log.Event("Starting VirtualBricks") components_not_found = log.Event("{text}\nThere are some components not " "found: {components} some functionalities may not be available.\nYou can " "disable this alert from the general settings.") brick_invalid_name = log.Event("Cannot create brick: Invalid name.") not_started = log.Event("Brick not started.") stop_error = log.Event("Error on stopping brick.") start_error = log.Event("Error on starting brick.") dnd_no_socks = log.Event("I don't know what to do, bricks have no socks.") dnd_dest_brick_not_found = log.Event("Cannot found dest brick") dnd_source_brick_not_found = log.Event("Cannot find source brick {name}") dnd_no_dest = log.Event("No destination brick") dnd_same_brick = log.Event("Source and destination bricks are the same.") cannot_rename = log.Event("Cannot rename Brick: it is in use.") s_r_not_supported = log.Event("Suspend/Resume not supported on this disk.") snap_error = log.Event("Error on snapshot") resume_vm = log.Event("Resuming virtual machine {name}") event_in_use = log.Event("Cannot rename event: it is in use.") proc_signal = log.Event("Sending to process signal {signame}!") send_acpi = log.Event("send ACPI {acpievent}") proc_restart = log.Event("Restarting process!") savevm = log.Event("Save snapshot on virtual machine {name}") qemu_version_parsing_error = log.Event("Error while parsing qemu version") retrieve_qemu_version_error = log.Event("Error while retrieving qemu version.") usb_access = log.Event("Cannot access /dev/bus/usb. Check user privileges.") no_kvm = log.Event("No KVM support found on the system. Check your active " "configuration. KVM will stay disabled.") BRICK_TARGET_NAME = "brick-connect-target" BRICK_DRAG_TARGETS = [ (BRICK_TARGET_NAME, gtk.TARGET_SAME_WIDGET | gtk.TARGET_SAME_APP, 0) ] @implementer(IMenu) class BaseMenu: def __init__(self, brick): self.original = brick def build(self, gui): menu = gtk.Menu() menu.append(gtk.MenuItem(self.original.get_name(), False)) menu.append(gtk.SeparatorMenuItem()) start_stop = gtk.MenuItem("_Start/Stop") start_stop.connect("activate", self.on_startstop_activate, gui) menu.append(start_stop) delete = gtk.MenuItem("_Delete") delete.connect("activate", self.on_delete_activate, gui) menu.append(delete) copy = gtk.MenuItem("Make a C_opy") copy.connect("activate", self.on_copy_activate, gui) menu.append(copy) rename = gtk.MenuItem("Re_name") rename.connect("activate", self.on_rename_activate, gui) menu.append(rename) configure = gtk.MenuItem("_Configure") configure.connect("activate", self.on_configure_activate, gui) menu.append(configure) return menu def popup(self, button, time, gui): menu = self.build(gui) menu.show_all() menu.popup(None, None, None, button, time) def on_configure_activate(self, menuitem, gui): gui.curtain_up(self.original) class BrickPopupMenu(BaseMenu): def build(self, gui): menu = BaseMenu.build(self, gui) attach = gtk.MenuItem("_Attach Event") attach.connect("activate", self.on_attach_activate, gui) menu.append(attach) return menu def on_startstop_activate(self, menuitem, gui): gui.startstop_brick(self.original) def on_delete_activate(self, menuitem, gui): gui.ask_remove_brick(self.original) def on_copy_activate(self, menuitem, gui): gui.brickfactory.dup_brick(self.original) def on_rename_activate(self, menuitem, gui): if self.original.proc is not None: logger.error(cannot_rename) else: dialogs.RenameBrickDialog(self.original, gui.brickfactory.normalize_name).show(gui.wndMain) def on_attach_activate(self, menuitem, gui): dialogs.AttachEventDialog(self.original, gui.factory).show(gui.wndMain) return True registerAdapter(BrickPopupMenu, Brick, IMenu) class VMPopupMenu(BrickPopupMenu): def build(self, gui): menu = BrickPopupMenu.build(self, gui) resume = gtk.MenuItem("_Resume VM") resume.connect("activate", self.on_resume_activate, gui) menu.append(resume) return menu def resume(self, factory): def grep(out, pattern): if out.find(pattern) == -1: raise RuntimeError(_("Cannot find suspend point.")) def loadvm(_): if self.original.proc is not None: self.original.send("loadvm virtualbricks\n") else: return self.original.poweron("virtualbricks") img = self.original.get("hda") if img.cow: path = img.get_cow_path() elif img.image: path = img.image.path else: logger.error(s_r_not_supported) return defer.fail(RuntimeError(_("Suspend/Resume not supported on " "this disk."))) args = ["snapshot", "-l", path] output = utils.getProcessOutput("qemu-img", args, os.environ) output.addCallback(grep, "virtualbricks") output.addCallback(loadvm) logger.log_failure(output, snap_error) return output def on_resume_activate(self, menuitem, gui): logger.debug(resume_vm, name=self.original.get_name()) gui.user_wait_action(self.resume(gui.brickfactory)) registerAdapter(VMPopupMenu, VirtualMachine, IMenu) class EventPopupMenu(BaseMenu): def on_startstop_activate(self, menuitem, gui): self.original.toggle() def on_delete_activate(self, menuitem, gui): gui.ask_remove_event(self.original) def on_copy_activate(self, menuitem, gui): gui.brickfactory.dup_event(self.original) def on_rename_activate(self, menuitem, gui): if not self.original.scheduled: dialogs.RenameDialog(self.original, gui.brickfactory.normalize_name).show(gui.wndMain) else: logger.error(event_in_use) registerAdapter(EventPopupMenu, Event, IMenu) @implementer(IMenu) class LinkMenu: def __init__(self, original): self.original = original def build(self, controller, gui): menu = gtk.Menu() edit = gtk.MenuItem(_("Edit")) edit.connect("activate", self.on_edit_activate, controller, gui) menu.append(edit) remove = gtk.MenuItem(_("Remove")) remove.connect("activate", self.on_remove_activate, controller) menu.append(remove) return menu def popup(self, button, time, controller, gui): menu = self.build(controller, gui) menu.show_all() menu.popup(None, None, None, button, time) def on_edit_activate(self, menuitem, controller, gui): dialogs.EditEthernetDialog(gui.brickfactory, self.original.brick, self.original).show(gui.wndMain) def on_remove_activate(self, menuitem, controller): controller.ask_remove_link(self.original) registerAdapter(LinkMenu, Plug, IMenu) registerAdapter(LinkMenu, Sock, IMenu) @implementer(IMenu) class JobMenu: def __init__(self, original): self.original = original def build(self, gui): menu = gtk.Menu() open = gtk.MenuItem(_("Open control monitor")) open.connect("activate", self.on_open_activate) menu.append(open) menu.append(gtk.SeparatorMenuItem()) stop = gtk.ImageMenuItem(gtk.STOCK_STOP) stop.connect("activate", self.on_stop_activate) menu.append(stop) cont = gtk.ImageMenuItem(gtk.STOCK_MEDIA_PLAY) cont.set_label(_("Continue")) cont.connect("activate", self.on_cont_activate) menu.append(cont) menu.append(gtk.SeparatorMenuItem()) reset = gtk.ImageMenuItem(gtk.STOCK_REDO) reset.set_label(_("Restart")) reset.connect("activate", self.on_reset_activate) menu.append(reset) kill = gtk.ImageMenuItem(gtk.STOCK_STOP) kill.set_label(_("Kill")) kill.connect("activate", self.on_kill_activate, gui) menu.append(kill) return menu def popup(self, button, time, gui): menu = self.build(gui) menu.show_all() menu.popup(None, None, None, button, time) @staticmethod def _cancel_call(passthru, call): if call.active(): call.cancel() return passthru @staticmethod def _refilter(passthru, filter_model): filter_model.refilter() return passthru def on_open_activate(self, menuitem): self.original.open_console() def on_stop_activate(self, menuitem): logger.debug(proc_signal, signame="SIGSTOP") try: self.original.send_signal(19) except error.ProcessExitedAlready: pass def on_cont_activate(self, menuitem): logger.debug(proc_signal, signame="SIGCONT") try: self.original.send_signal(18) except error.ProcessExitedAlready: pass def on_reset_activate(self, menuitem): logger.debug(proc_restart) d = self.original.poweroff() # give it 2 seconds before an hard reset call = reactor.callLater(2, self.original.poweroff, kill=True) d.addBoth(self._cancel_call, call) d.addCallback(lambda _: self.original.poweron()) def on_kill_activate(self, menuitem, gui): logger.debug(proc_signal, signame="SIGKILL") try: d = self.original.poweroff(kill=True) except error.ProcessExitedAlready: pass registerAdapter(JobMenu, Brick, IJobMenu) class VMJobMenu(JobMenu): def build(self, gui): menu = JobMenu.build(self, gui) suspend = gtk.MenuItem(_("Suspend virtual machine")) suspend.connect("activate", self.on_suspend_activate, gui) menu.insert(suspend, 5) powerdown = gtk.MenuItem(_("Send ACPI powerdown")) powerdown.connect("activate", self.on_powerdown_activate) menu.insert(powerdown, 6) reset = gtk.MenuItem(_("Send ACPI hard reset")) reset.connect("activate", self.on_reset_activate) menu.insert(reset, 7) menu.insert(gtk.SeparatorMenuItem(), 8) term = gtk.ImageMenuItem(gtk.STOCK_DELETE) term.set_label(_("Terminate")) term.connect("activate", self.on_term_activate, gui) menu.insert(term, 10) return menu def suspend(self, factory): img = self.original.get("hda") if img.cow: path = img.get_cow_path() elif img.image: path = img.image.path else: logger.error(s_r_not_supported) return defer.fail(RuntimeError(_("Suspend/Resume not supported on " "this disk."))) if tools.image_type_from_file(path) == tools.ImageFormat.QCOW2: self.original.send("savevm virtualbricks\n") return self.original.poweroff() else: logger.error(s_r_not_supported) return defer.fail(RuntimeError(_("Suspend/Resume not supported on " "this disk."))) def on_suspend_activate(self, menuitem, gui): logger.debug(savevm, name=self.original.get_name()) gui.user_wait_action(self.suspend(gui.brickfactory)) def on_powerdown_activate(self, menuitem): logger.info(send_acpi, acpievent="powerdown") self.original.send("system_powerdown\n") def on_reset_activate(self, menuitem): logger.info(send_acpi, acpievent="reset") self.original.send("system_reset\n") def on_term_activate(self, menuitem, gui): logger.debug(proc_signal, signame="SIGTERM") d = self.original.poweroff(term=True) registerAdapter(VMJobMenu, VirtualMachine, IJobMenu) @implementer(IConfigController) class ConfigController(object): domain = "virtualbricks" resource = None def __init__(self, original): self.original = original self.builder = builder = gtk.Builder() builder.set_translation_domain(self.domain) builder.add_from_file(graphics.get_data_filename(self.resource)) builder.connect_signals(self) def __getattr__(self, name): obj = self.builder.get_object(name) if obj is None: raise AttributeError(name) return obj def __dispose__(self): pass def on_ok_button_clicked(self, button, gui): self.configure_brick(gui) dispose(self) gui.curtain_down() # def on_save_button_clicked(self, button, gui): # # TODO: update config values # self.configure_brick(gui) def on_cancel_button_clicked(self, button, gui): dispose(self) gui.curtain_down() def get_object(self, name): return self.builder.get_object(name) def get_view(self, gui): bbox = gtk.HButtonBox() bbox.set_layout(gtk.BUTTONBOX_END) bbox.set_spacing(5) ok_button = gtk.Button(stock=gtk.STOCK_OK) ok_button.connect("clicked", self.on_ok_button_clicked, gui) bbox.add(ok_button) bbox.set_child_secondary(ok_button, False) # save_button = gtk.Button(stock=gtk.STOCK_SAVE) # save_button.connect("clicked", self.on_save_button_clicked, gui) # bbox.add(save_button) cancel_button = gtk.Button(stock=gtk.STOCK_CANCEL) cancel_button.connect("clicked", self.on_cancel_button_clicked, gui) bbox.add(cancel_button) bbox.set_child_secondary(cancel_button, True) box = gtk.VBox() box.pack_end(bbox, False) box.pack_end(gtk.HSeparator(), False, False, 3) box.show_all() box.pack_start(self.get_config_view(gui)) return box class EventConfigController(ConfigController, dialogs.EventControllerMixin): resource = "eventconfig.ui" def get_config_view(self, gui): self.setup_controller(self.original) entry = self.get_object("delay_entry") entry.set_text(self.original.config.get("delay")) return self.get_object("vbox1") def configure_brick(self, gui): attributes = {} text = self.get_object("delay_entry").get_text() if self.original.config.get("delay") != text: if not text: text = 0 attributes["delay"] = int(text) self.configure_event(self.original, attributes) def on_delay_entry_key_press_event(self, entry, event): if gtk.gdk.keyval_name(event.keyval) not in dialogs.VALIDKEY: return True def on_action_treeview_key_press_event(self, treeview, event): if gtk.gdk.keyval_name(event.keyval) == "Delete": selection = treeview.get_selection() model, selected = selection.get_selected_rows() rows = [] for path in selected: rows.append(gtk.TreeRowReference(model, path)) for row in rows: iter = model.get_iter(row.get_path()) next = model.iter_next(iter) model.remove(iter) if next is None: self.model.append(("", False)) registerAdapter(EventConfigController, Event, IConfigController) class SwitchConfigController(ConfigController): resource = "switchconfig.ui" def get_config_view(self, gui): self.get_object("fstp_checkbutton").set_active( self.original.get("fstp")) self.get_object("hub_checkbutton").set_active( self.original.get("hub")) minports = len([1 for b in iter(gui.brickfactory.bricks) for p in b.plugs if b.socks and p.sock.nickname == b.socks[0].nickname]) spinner = self.get_object("ports_spinbutton") spinner.set_range(max(minports, 1), 128) spinner.set_value(self.original.get("numports")) return self.get_object("table") def configure_brick(self, gui): cfg = { "fstp": self.get_object("fstp_checkbutton").get_active(), "hub": self.get_object("hub_checkbutton").get_active(), "numports": self.get_object("ports_spinbutton").get_value_as_int() } self.original.set(cfg) class SwitchWrapperConfigController(ConfigController): resource = "switchwrapperconfig.ui" def get_config_view(self, gui): self.get_object("entry").set_text(self.original.get("path")) return self.get_object("table1") def configure_brick(self, gui): self.original.set({"path": self.get_object("entry").get_text()}) def _sock_should_visible(model, iter): sock = model.get_value(iter, 0) return sock and (sock.brick.get_type().startswith('Switch') or settings.femaleplugs) def _set_text(column, cell_renderer, model, itr): sock = model.get_value(itr, 0) cell_renderer.set_property("text", sock.nickname) class _PlugMixin(object): def configure_sock_combobox(self, combo, model, brick, plug, gui): filtered_model = model.filter_new() filtered_model.set_visible_func(_sock_should_visible) combo.set_model(filtered_model) cell = combo.get_cells()[0] combo.set_cell_data_func(cell, _set_text) if plug.configured(): itr = filtered_model.get_iter_first() while itr: if filtered_model[itr][0] is plug.sock: combo.set_active_iter(itr) break itr = filtered_model.iter_next(itr) def connect_plug(self, plug, combo): itr = combo.get_active_iter() if itr: model = combo.get_model() plug.connect(model[itr][0]) class TapConfigController(_PlugMixin, ConfigController): resource = "tapconfig.ui" def get_config_view(self, gui): combo = self.get_object("combobox") self.configure_sock_combobox(combo, gui.brickfactory.socks.filter_new(), self.original, self.original.plugs[0], gui) self.get_object("ip_entry").set_text(self.original.get("ip")) self.get_object("nm_entry").set_text(self.original.get("nm")) self.get_object("gw_entry").set_text(self.original.get("gw")) # default to manual if not valid mode is set if self.original.get("mode") == "off": self.get_object("nocfg_radiobutton").set_active(True) elif self.original.get("mode") == "dhcp": self.get_object("dhcp_radiobutton").set_active(True) else: self.get_object("manual_radiobutton").set_active(True) self.get_object("ipconfig_table").set_sensitive( self.original.get("mode") == "manual") return self.get_object("table1") def configure_brick(self, gui): if self.get_object("nocfg_radiobutton").get_active(): self.original.set({"mode": "off"}) elif self.get_object("dhcp_radiobutton").get_active(): self.original.set({"mode": "dhcp"}) else: self.original.set({"mode": "manual", "ip": self.get_object("ip_entry").get_text(), "nm": self.get_object("nm_entry").get_text(), "gw": self.get_object("gw_entry").get_text()}) self.connect_plug(self.original.plugs[0], self.get_object("combobox")) def on_manual_radiobutton_toggled(self, radiobtn): self.get_object("ipconfig_table").set_sensitive(radiobtn.get_active()) class CaptureConfigController(_PlugMixin, ConfigController): resource = "captureconfig.ui" def get_config_view(self, gui): combo = self.get_object("combobox1") self.configure_sock_combobox(combo, gui.brickfactory.socks.filter_new(), self.original, self.original.plugs[0], gui) combo2 = self.get_object("combobox2") model = combo2.get_model() with open("/proc/net/dev") as fd: # skip the header next(fd), next(fd) for line in fd: name = line.strip().split(":")[0] if name != "lo": itr = model.append((name, )) if self.original.get("iface") == name: combo2.set_active_iter(itr) return self.get_object("table1") def configure_brick(self, gui): self.connect_plug(self.original.plugs[0], self.get_object("combobox1")) combo = self.get_object("combobox2") itr = combo.get_active_iter() if itr is not None: model = combo.get_model() self.original.set({"iface": model[itr][0]}) def on_manual_radiobutton_toggled(self, radiobtn): self.get_object("ipconfig_table").set_sensitive(radiobtn.get_active()) class WireConfigController(_PlugMixin, ConfigController): resource = "wireconfig.ui" def get_config_view(self, gui): for i, wname in enumerate(("sock0_combobox", "sock1_combobox")): combo = self.get_object(wname) self.configure_sock_combobox(combo, gui.brickfactory.socks.filter_new(), self.original, self.original.plugs[i], gui) return self.get_object("vbox") def configure_brick(self, gui): for i, wname in enumerate(("sock0_combobox", "sock1_combobox")): self.connect_plug(self.original.plugs[i], self.get_object(wname)) NO, MAYBE, YES = range(3) @implementer(IPrerequisite) class CompoundPrerequisite: def __init__(self, *prerequisites): self.prerequisites = list(prerequisites) def add_prerequisite(self, prerequisite): self.prerequisites.append(prerequisite) def __call__(self): for prerequisite in self.prerequisites: satisfied = prerequisite() if satisfied in (YES, NO): return satisfied return MAYBE @implementer(IState) class State: def __init__(self): self.prerequisite = CompoundPrerequisite() self.controls = [] def add_prerequisite(self, prerequisite): self.prerequisite.add_prerequisite(prerequisite) def add_control(self, control): self.controls.append(control) def check(self): enable = self.prerequisite() for control in self.controls: control.react(enable) @implementer(IControl) class SensitiveControl: def __init__(self, widget, tooltip=None): self.widget = widget self.tooltip = tooltip def react(self, enable): self.set_sensitive(enable) def set_sensitive(self, sensitive): if self.widget.get_sensitive() ^ sensitive: self.widget.set_sensitive(sensitive) tooltip = self.tooltip self.tooltip = self.widget.get_tooltip_markup() self.widget.set_tooltip_markup(tooltip) @implementer(IControl) class InsensitiveControl: def __init__(self, widget, tooltip=None): self.widget = widget self.tooltip = widget.get_tooltip_markup() widget.set_tooltip_markup(tooltip) def react(self, enable): disable = not enable if self.widget.get_sensitive() ^ disable: self.widget.set_sensitive(disable) tooltip = self.tooltip self.tooltip = self.widget.get_tooltip_markup() self.widget.set_tooltip_markup(tooltip) @implementer(IControl) class ActiveControl: def __init__(self, widget): self.widget = widget def react(self, enable): if not enable: self.widget.set_active(False) @implementer(IStateManager) class StateManager: control_factory = SensitiveControl def __init__(self): self.states = [] def add_state(self, state): self.states.append(state) def _build_state(self, tooltip, *widgets): state = State() for widget in widgets: state.add_control(self.control_factory(widget, tooltip)) self.add_state(state) return state def _add_checkbutton(self, checkbutton, prerequisite, tooltip=None, *widgets): state = self._build_state(tooltip, *widgets) state.add_prerequisite(prerequisite) checkbutton.connect("toggled", lambda cb: state.check()) state.check() return state def add_checkbutton_active(self, checkbutton, tooltip=None, *widgets): return self._add_checkbutton(checkbutton, checkbutton.get_active, tooltip, *widgets) def add_checkbutton_not_active(self, checkbutton, tooltip=None, *widgets): return self._add_checkbutton(checkbutton, lambda: not checkbutton.get_active(), tooltip, *widgets) class NetemuConfigController(_PlugMixin, ConfigController): resource = "netemuconfig.ui" state_manager = None help = help.Help() config_to_checkbutton_mapping = ( ("chanbufsizesymm", "chanbufsize_checkbutton"), ("delaysymm", "delay_checkbutton"), ("losssymm", "loss_checkbutton"), ("bandwidthsymm", "bandwidth_checkbutton"), ) config_to_spinint_mapping = ( ("chanbufsizer", "chanbufsizer_spinbutton"), ("chanbufsize", "chanbufsize_spinbutton"), ("delayr", "delayr_spinbutton"), ("delay", "delay_spinbutton"), ("bandwidthr", "bandwidthr_spinbutton"), ("bandwidth", "bandwidth_spinbutton"), ) config_to_spinfloat_mapping = ( ("lossr", "lossr_spinbutton"), ("loss", "loss_spinbutton"), ) help_buttons = ( "chanbufsize_help_button", "delay_help_button", "loss_help_button", "bandwidth_help_button", ) def get_config_view(self, gui): go = self.get_object get = self.original.get for pname, wname in self.config_to_checkbutton_mapping: go(wname).set_active(not get(pname)) for pname, wname in self.config_to_spinint_mapping: go(wname).set_value(get(pname)) for pname, wname in self.config_to_spinfloat_mapping: go(wname).set_value(get(pname)) self.state_manager = manager = StateManager() params = ("chanbufsize", "delay", "loss", "bandwidth") for param in params: checkbutton = go(param + "_checkbutton") checkbutton.set_active(not self.original.get(param + "symm")) tooltip = _("Disabled because set symmetric") spinbutton = go(param + "r_spinbutton") manager.add_checkbutton_active(checkbutton, tooltip, spinbutton) # setup help buttons for button in self.help_buttons: go(button).connect("clicked", self.help.on_help_button_clicked) # setup plugs for i, wname in enumerate(("sock0_combobox", "sock1_combobox")): combo = self.get_object(wname) self.configure_sock_combobox(combo, gui.brickfactory.socks.filter_new(), self.original, self.original.plugs[i], gui) return go("netemu_config_panel") def configure_brick(self, gui): cfg = {} go = self.get_object for config_name, widget_name in self.config_to_checkbutton_mapping: cfg[config_name] = not go(widget_name).get_active() for pname, wname in self.config_to_spinint_mapping: cfg[pname] = go(wname).get_value_as_int() for pname, wname in self.config_to_spinfloat_mapping: cfg[pname] = go(wname).get_value() self.original.set(cfg) # configure plug for i, wname in enumerate(("sock0_combobox", "sock1_combobox")): self.connect_plug(self.original.plugs[i], self.get_object(wname)) def on_reset_button_clicked(self, button): self.get_object("chanbufsize_spinbutton").set_value(75000) self.get_object("chanbufsizer_spinbutton").set_value(75000) self.get_object("delay_spinbutton").set_value(0) self.get_object("delayr_spinbutton").set_value(0) self.get_object("loss_spinbutton").set_value(0) self.get_object("lossr_spinbutton").set_value(0) self.get_object("bandwidth_spinbutton").set_value(125000) self.get_object("bandwidthr_spinbutton").set_value(125000) class TunnelListenConfigController(_PlugMixin, ConfigController): resource = "tunnellconfig.ui" def get_config_view(self, gui): combo = self.get_object("combobox") self.configure_sock_combobox(combo, gui.brickfactory.socks.filter_new(), self.original, self.original.plugs[0], gui) port = self.get_object("port_spinbutton") port.set_value(self.original.get("port")) password = self.get_object("password_entry") password.set_text(self.original.get("password")) return self.get_object("table1") def configure_brick(self, gui): self.connect_plug(self.original.plugs[0], self.get_object("combobox")) port = self.get_object("port_spinbutton").get_value_as_int() password = self.get_object("password_entry").get_text() self.original.set({"port": port, "password": password}) class TunnelClientConfigController(TunnelListenConfigController): resource = "data/tunnelcconfig.ui" def get_config_view(self, gui): host = self.get_object("host_entry") host.set_text(self.original.get("host")) localport = self.get_object("localport_spinbutton") localport.set_value(self.original.get("localport")) return TunnelListenConfigController.get_config_view(self, gui) def configure_brick(self, gui): TunnelListenConfigController.configure_brick(self, gui) host = self.get_object("host_entry").get_text() lport = self.get_object("localport_spinbutton").get_value_as_int() self.original.set({"host": host, "localport": lport}) def get_selection(treeview): selection = treeview.get_selection() if selection is not None: model, iter = selection.get_selected() if iter is not None: return model.get_value(iter, 0) def get_element_at_click(treeview, event): pthinfo = treeview.get_path_at_pos(int(event.x), int(event.y)) if pthinfo is not None: path, col, cellx, celly = pthinfo treeview.grab_focus() treeview.set_cursor(path, col, 0) model = treeview.get_model() obj = model.get_value(model.get_iter(path), 0) return obj def _set_vlan(column, cell_renderer, model, itr): vlan = model.get_path(itr)[0] cell_renderer.set_property("text", vlan) def _set_connection(column, cell_renderer, model, iter): link = model.get_value(iter, 0) if link.mode == "hostonly": conn = "Host" elif link.sock: conn = link.sock.brick.name elif link.mode == "sock" and settings.femaleplugs: conn = "Vde socket (female plug)" else: conn = "None" cell_renderer.set_property("text", conn) def _set_model(column, cell_renderer, model, iter): link = model.get_value(iter, 0) cell_renderer.set_property("text", link.model) def _set_mac(column, cell_renderer, model, iter): link = model.get_value(iter, 0) cell_renderer.set_property("text", link.mac) class ImageFormatter(string.Formatter): def format(self, format_string, image): if image is None: return "" return format(image, format_string) BOOT_DEVICE = ( ("", "hd1"), ("a", "floppy"), ("d", "cdrom"), ) SOUND_DEVICE = ( ("", "no audio"), ("pcspk", "PC speaker"), ("sb16", "Creative Sound Blaster 16"), ("ac97", "Intel 82801AA AC97 Audio"), ("es1370", "ENSONIQ AudioPCI ES1370"), ) MOUNT_DEVICE = ( ("", "No"), ("/dev/cdrom", "cdrom"), ) class ImagesBindingList(widgets.ImagesBindingList): def __iter__(self): yield None for image in widgets.ImagesBindingList.__iter__(self): yield image class QemuConfigController(ConfigController): resource = "qemuconfig.ui" config_to_widget_mapping = ( ("snapshot", "snapshot_checkbutton"), ("deviceen", "rbDeviceen"), ("cdromen", "rbCdromen"), ("use_virtio", "virtio_checkbutton"), ("privatehda", "privatehda_checkbutton"), ("privatehdb", "privatehdb_checkbutton"), ("privatehdc", "privatehdc_checkbutton"), ("privatehdd", "privatehdd_checkbutton"), ("privatefda", "privatefda_checkbutton"), ("privatefdb", "privatefdb_checkbutton"), ("privatemtdblock", "privatemtdblock_checkbutton"), ("kvm", "cbKvm"), ("kvmsm", "cbKvmsm"), ("novga", "cbNovga"), ("vga", "vga_checkbutton"), ("vnc", "cbVnc"), ("sdl", "sdl_checkbutton"), ("portrait", "portrait_checkbutton"), ("usbmode", "cbUsbmode"), ("rtc", "rtc_checkbutton"), ("tdf", "cbTdf"), ("serial", "serial_checkbutton"), ("kernelenbl", "cbKernelen"), ("initrdenbl", "cbInitrden"), ("gdb", "cbGdb") ) config_to_filechooser_mapping = ( ("cdrom", "fcCdrom"), ("kernel", "fcKernel"), ("initrd", "fcInitrd"), ("icon", "icon_filechooser") ) config_to_spinint_mapping = ( ("smp", "smp_spinint"), ("ram", "ram_spinint"), ("kvmsmem", "siKvmsmem"), ("vncN", "siVncN"), ("gdbport", "siGdbport") ) state_manager = None __images_list = None def setup_netwoks_cards(self): vmplugs = self.get_object("plugsmodel") vmplugs.clear() for plug in self.original.plugs: vmplugs.append((plug, )) if self.gui.config.femaleplugs: for sock in self.original.socks: vmplugs.append((sock,)) vlan_c = self.get_object("vlan_treeviewcolumn") vlan_cr = self.get_object("vlan_cellrenderer") vlan_c.set_cell_data_func(vlan_cr, _set_vlan) connection_c = self.get_object("connection_treeviewcolumn") connection_cr = self.get_object("connection_cellrenderer") connection_c.set_cell_data_func(connection_cr, _set_connection) model_c = self.get_object("model_treeviewcolumn") model_cr = self.get_object("model_cellrenderer") model_c.set_cell_data_func(model_cr, _set_model) mac_c = self.get_object("mac_treeviewcolumn") mac_cr = self.get_object("mac_cellrenderer") mac_c.set_cell_data_func(mac_cr, _set_mac) def get_config_view(self, gui): def install_qemu_version(version): qemu.parse_and_install(version) container = panel.get_parent() container.remove(panel) container.pack_start(self._get_config_view(gui)) def close_panel(failure): logger.failure(qemu_version_parsing_error, failure) gui.curtain_down() qemu_exe = os.path.join(gui.config.get('qemupath'), "kvm") d = utils.getProcessOutput(qemu_exe, ["-version"]) d.addCallbacks(install_qemu_version, logger.failure_eb, errbackArgs=(retrieve_qemu_version_error, True)) d.addErrback(close_panel) panel = gtk.Alignment(0.5, 0.5) label = gtk.Label("Loading configuration...") panel.add(label) panel.show_all() return panel def _get_config_view(self, gui): self.gui = gui self.usb_devices = list(self.original.config["usbdevlist"]) self.state_manager = StateManager() self.state_manager.add_checkbutton_active(self.rbDeviceen, _("Mount cdrom option not active"), self.cbMount) self.state_manager.add_checkbutton_active(self.rbCdromen, _("File image option not active"), self.fcCdrom) self.state_manager.add_checkbutton_not_active(self.cbNovga, _("Graphical output disabled"), self.cbVnc, self.siVncN, self.lblVnc) self.state_manager.add_checkbutton_not_active(self.cbVnc, _("VNC enabled"), self.cbNovga) self.state_manager.add_checkbutton_active(self.cbKernelen, _("Custom kernel selction option disabled"), self.fcKernel) self.state_manager.add_checkbutton_active(self.cbInitrden, _("Initrd option disabled"), self.fcInitrd) self.state_manager.add_checkbutton_active(self.cbGdb, _("Kernel debugging disabled"), self.siGdbport, self.lblGdbport) # usb options def usb_check(): active = self.cbUsbmode.get_active() if active and not os.access("/dev/bus/usb", os.W_OK): self.cbUsbmode.set_active(False) logger.error(usb_access) return False return active usbstate = State() tooltip = _("USB disabled or /dev/bus/usb not accessible") usbstate.add_control(SensitiveControl(self.btnBind, tooltip)) usbstate.add_prerequisite(usb_check) self.cbUsbmode.connect("toggled", lambda cb: usbstate.check()) usbstate.check() # kvm options def check_kvm(): if self.cbKvm.get_active(): supported = tools.check_kvm(gui.config.get("qemupath")) if not supported: self.cbKvm.set_active(False) logger.error(no_kvm) return supported return False kvmstate = State() tooltip = _("KVM support not found") kvmstate.add_control(SensitiveControl(self.siKvmsmem, tooltip)) kvmstate.add_control(SensitiveControl(self.cbKvmsm, tooltip)) kvmstate.add_control(SensitiveControl(self.lblKvmsm, tooltip)) kvmstate.add_control(SensitiveControl(self.cbTdf, tooltip)) kvmstate.add_control(ActiveControl(self.cbTdf)) tooltip = _("KVM activated") kvmstate.add_control(InsensitiveControl(self.cbArgv0, tooltip)) kvmstate.add_control(InsensitiveControl(self.cbCpu, tooltip)) kvmstate.add_control(InsensitiveControl(self.cbMachine, tooltip)) kvmstate.add_prerequisite(check_kvm) self.cbKvm.connect("toggled", lambda cb: kvmstate.check()) kvmstate.check() # argv0/cpu/machine comboboxes exes = qemu.get_executables() self.lArgv0.set_data_source(map(widgets.ListEntry.from_tuple, exes)) self.cbArgv0.set_selected_value(self.original.config["argv0"]) self.cbArgv0.set_cell_data_func(self.crf1, self.crf1.set_text) self.cbCpu.set_cell_data_func(self.crf2, self.crf2.set_text) self.cbMachine.set_cell_data_func(self.crf3, self.crf3.set_text) # boot/sound/mount comboboxes boots = map(widgets.ListEntry.from_tuple, BOOT_DEVICE) self.lBoot.set_data_source(boots) self.cbBoot.set_selected_value(self.original.config["boot"]) self.cbBoot.set_cell_data_func(self.crf4, self.crf4.set_text) sounds = map(widgets.ListEntry.from_tuple, SOUND_DEVICE) self.lSound.set_data_source(sounds) self.cbSound.set_selected_value(self.original.config["soundhw"]) self.cbSound.set_cell_data_func(self.crf5, self.crf5.set_text) devices = map(widgets.ListEntry.from_tuple, MOUNT_DEVICE) self.lDevice.set_data_source(devices) self.cbMount.set_selected_value(self.original.config["device"]) self.cbMount.set_cell_data_func(self.crf6, self.crf6.set_text) # harddisks self.__images_list = ImagesBindingList(gui.factory) formatter = ImageFormatter() self.lImages.set_data_source(self.__images_list) self.cbHda.set_selected_value(self.original.config["hda"].image) self.cbHda.set_cell_data_func(self.crf7, self.crf7.set_text) self.crf7.set_property("formatter", formatter) self.cbHdb.set_selected_value(self.original.config["hdb"].image) self.cbHdb.set_cell_data_func(self.crf8, self.crf8.set_text) self.crf8.set_property("formatter", formatter) self.cbHdc.set_selected_value(self.original.config["hdc"].image) self.cbHdc.set_cell_data_func(self.crf9, self.crf9.set_text) self.crf9.set_property("formatter", formatter) self.cbHdd.set_selected_value(self.original.config["hdd"].image) self.cbHdd.set_cell_data_func(self.crf10, self.crf10.set_text) self.crf10.set_property("formatter", formatter) self.cbFda.set_selected_value(self.original.config["fda"].image) self.cbFda.set_cell_data_func(self.crf11, self.crf11.set_text) self.crf11.set_property("formatter", formatter) self.cbFdb.set_selected_value(self.original.config["fdb"].image) self.cbFdb.set_cell_data_func(self.crf12, self.crf12.set_text) self.crf12.set_property("formatter", formatter) self.cbMtdblock.set_selected_value( self.original.config["mtdblock"].image) self.crf13.set_property("formatter", formatter) self.cbMtdblock.set_cell_data_func(self.crf13, self.crf13.set_text) cfg = self.original.config go = self.get_object for pname, wname in self.config_to_widget_mapping: go(wname).set_active(cfg[pname]) for pname, wname in self.config_to_spinint_mapping: go(wname).set_value(cfg[pname]) for pname, wname in self.config_to_filechooser_mapping: if cfg[pname]: go(wname).set_filename(cfg[pname]) self.setup_netwoks_cards() go("cfg_Qemu_keyboard_text").set_text(cfg["keyboard"]) go("kopt_textbutton").set_text(cfg["kopt"]) return self.get_object("box_vmconfig") def configure_brick(self, gui): cfg = {} # argv0/cpu/machine comboboxes cfg["argv0"] = self.cbArgv0.get_selected_value() or "" cfg["cpu"] = self.cbCpu.get_selected_value() or "" cfg["machine"] = self.cbMachine.get_selected_value() or "" # boot/sound/mount comboboxes cfg["boot"] = self.cbBoot.get_selected_value() cfg["soundhw"] = self.cbSound.get_selected_value() cfg["device"] = self.cbMount.get_selected_value() # harddisks self.original.set_image("hda", self.cbHda.get_selected_value()) self.original.set_image("hdb", self.cbHdb.get_selected_value()) self.original.set_image("hdc", self.cbHdc.get_selected_value()) self.original.set_image("hdd", self.cbHdd.get_selected_value()) self.original.set_image("fda", self.cbFda.get_selected_value()) self.original.set_image("fdb", self.cbFdb.get_selected_value()) self.original.set_image("mtdblock", self.cbMtdblock.get_selected_value()) for config_name, widget_name in self.config_to_widget_mapping: cfg[config_name] = self.get_object(widget_name).get_active() for pname, wname in self.config_to_spinint_mapping: cfg[pname] = self.get_object(wname).get_value_as_int() for pname, wname in self.config_to_filechooser_mapping: filename = self.get_object(wname).get_filename() if filename: cfg[pname] = filename cfg["keyboard"] = self.get_object("cfg_Qemu_keyboard_text").get_text() cfg["kopt"] = self.get_object("kopt_textbutton").get_text() if self.cbUsbmode.get_active(): devs = list(set(self.usb_devices)) else: devs = [] cfg["usbdevlist"] = devs self.original.update_usbdevlist(devs) self.original.set(cfg) def __dispose__(self): if self.__images_list is not None: dispose(self.__images_list) self.__images_list = None # signals def on_newimage_button_clicked(self, button): dialogs.choose_new_image(self.gui, self.gui.brickfactory) def on_configimage_button_clicked(self, button): dialogs.DisksLibraryDialog(self.original.factory).show() def on_newempty_button_clicked(self, button): dialogs.CreateImageDialog(self.gui, self.gui.brickfactory).show( self.gui.wndMain) def on_cbArgv0_changed(self, combobox): arch = self.cbArgv0.get_selected_value() if arch: cpus = map(widgets.ListEntry.from_tuple, qemu.get_cpus(arch)) self.lCpu.set_data_source(cpus) machines = map(widgets.ListEntry.from_tuple, qemu.get_machines(arch)) self.lMachine.set_data_source(machines) def on_btnBind_clicked(self, button): dialogs.UsbDevWindow.show_dialog(self.gui, self.usb_devices) def _remove_link(self, link, model): if link.brick.proc and link.hotdel: # XXX: why checking hotdel? is a method it is always true or raise # an exception if it is not defined link.hotdel() self.original.remove_plug(link) itr = model.get_iter_first() while itr: plug = model.get_value(itr, 0) if plug is link: model.remove(itr) break itr = model.iter_next(itr) def ask_remove_link(self, link): question = _("Do you really want to delete the network interface?") model = self.get_object("plugsmodel") remove = lambda _: self._remove_link(link, model) dialogs.ConfirmDialog(question, on_yes=remove).show( self.gui.wndMain) def on_networkcards_treeview_key_press_event(self, treeview, event): if gtk.gdk.keyval_from_name("Delete") == event.keyval: link = get_selection(treeview) if link is not None: self.ask_remove_link(link) return True def on_networkcards_treeview_button_release_event(self, treeview, event): if event.button == 3: link = get_element_at_click(treeview, event) if link: IMenu(link).popup(event.button, event.time, self, self.gui) return True def on_addplug_button_clicked(self, button): model = self.get_object("plugsmodel") dialogs.AddEthernetDialog(self.gui.brickfactory, self.original, model).show(self.gui.wndMain) def on_setdefaulticon_button_clicked(self, button): self.get_object("qemuicon").set_from_pixbuf( graphics.pixbuf_for_brick_type("qemu")) def on_icon_filechooser_file_set(self, filechooser): raise NotImplementedError( "QemuConfigController.on_icon_filechooser_file_set") def config_panel_factory(context): type = context.get_type() if type == "Switch": return SwitchConfigController(context) elif type == "SwitchWrapper": return SwitchWrapperConfigController(context) elif type == "Tap": return TapConfigController(context) elif type == "Capture": return CaptureConfigController(context) elif type == "Wire": return WireConfigController(context) elif type == "Netemu": return NetemuConfigController(context) elif type == "TunnelConnect": return TunnelClientConfigController(context) elif type == "TunnelListen": return TunnelListenConfigController(context) elif type == "Qemu": return QemuConfigController(context) registerAdapter(config_panel_factory, Brick, IConfigController) class SyncProtocol(protocol.ProcessProtocol): def __init__(self, done): self.done = done def processEnded(self, status): if isinstance(status.value, error.ProcessTerminated): logger.failure(sync_error, status) self.done.errback(None) else: self.done.callback(None) class QemuImgCreateProtocol(protocol.ProcessProtocol): def __init__(self, done): self.done = done def processEnded(self, status): if isinstance(status.value, error.ProcessTerminated): logger.failure(create_image_error, status) self.done.errback(None) else: reactor.spawnProcess(SyncProtocol(self.done), "sync", ["sync"], os.environ) def state_add_selection(manager, treeview, prerequisite, tooltip, *widgets): state = manager._build_state(tooltip, *widgets) state.add_prerequisite(prerequisite) selection = treeview.get_selection() selection.connect("changed", lambda s: state.check()) state.check() return state BRICKS_TAB, EVENTS_TAB, RUNNING_TAB, TOPOLOGY_TAB, README_TAB = range(5) class TopologyMixin(object): __should_draw_topology = False __topology = None # public interface def draw_topology(self, export=""): if self.get_object("main_notebook").get_current_page() == TOPOLOGY_TAB: self._draw_topology() else: self.__should_draw_topology = True # callbacks def on_topology_h_scrolled(self, adjustment): self.__topology.x_adj = adjustment.get_value() def on_topology_v_scrolled(self, adjustment): self.__topology.y_adj = adjustment.get_value() def on_topology_orientation_toggled(self, togglebutton): self._draw_topology() def on_topology_export_button_clicked(self, button): def on_response(dialog, response_id): assert self.__topology, "Topology not created" try: if response_id == gtk.RESPONSE_OK: try: self._draw_topology_if_needed() self.__topology.export(dialog.get_filename()) except KeyError: logger.failure(top_invalid_format) except IOError: logger.failure(top_write_error) except: logger.failure(top_unknown) finally: dialog.destroy() chooser = gtk.FileChooserDialog(title=_("Select an image file"), action=gtk.FILE_CHOOSER_ACTION_OPEN, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) chooser.set_do_overwrite_confirmation(True) chooser.connect("response", on_response) chooser.show() def on_topology_action(self, widget, event): self._draw_topology_if_needed() assert self.__topology, "Topology not created" brick = self._get_brick_in(*event.get_coords()) if brick: if event.button == 3: IMenu(brick, None).popup(event.button, event.time, self) elif event.button == 1 and event.type == gtk.gdk._2BUTTON_PRESS: self.startstop_brick(brick) return True # Notebook callbacks def on_main_notebook_change_current_page(self, notebook, offset): self._draw_topology_if_on_page(notebook.get_current_page()) super(TopologyMixin, self).on_main_notebook_change_current_page( notebook, offset) def on_main_notebook_switch_page(self, notebook, _, page_num): self._draw_topology_if_on_page(page_num) super(TopologyMixin, self).on_main_notebook_switch_page( notebook, _, page_num) def on_main_notebook_select_page(self, notebook, move_focus): self._draw_topology_if_on_page(notebook.get_current_page()) super(TopologyMixin, self).on_main_notebook_select_page( notebook, move_focus) # VBGUI callbacks def init(self, factory): super(TopologyMixin, self).init(factory) topology_scrolled = self.get_object("topology_scrolled") hadjustment = topology_scrolled.get_hadjustment() hadjustment.connect("value-changed", self.on_topology_h_scrolled) vadjustment = topology_scrolled.get_vadjustment() vadjustment.connect("value-changed", self.on_topology_v_scrolled) def _get_brick_in(self, x, y): assert self.__topology, "Topology not created" for n in self.__topology.nodes: if n.here(x, y): return self.brickfactory.get_brick_by_name(n.name) def _draw_topology_if_on_page(self, page): if page == TOPOLOGY_TAB and self.__should_draw_topology: self._draw_topology() def _draw_topology_if_needed(self): if self.__should_draw_topology: self._draw_topology() def _draw_topology(self): logger.debug(drawing_topology) if self.get_object('topology_tb').get_active(): orientation = "TB" else: orientation = "LR" self.__topology = graphics.Topology( self.get_object('image_topology'), self.brickfactory.bricks, 1.00, orientation, settings.VIRTUALBRICKS_HOME) self.__should_draw_topology = False class ReadmeMixin(object): __deleyed_call = None manager = project.manager def __get_buffer(self): return self.get_object("readme_textview").get_buffer() def __get_modified(self): return self.__get_buffer().get_modified() def __set_modified(self, modified): return self.__get_buffer().set_modified(modified) def __get_text(self): return self.__get_buffer().get_property("text") def __set_text(self, text): self.__get_buffer().set_text(text) def __save_readme(self): if self.__get_modified(): self.manager.current.set_description(self.__get_text()) self.__set_modified(False) def __load_readme(self): buf = self.__get_buffer() buf.handler_block_by_func(self.__on_modify) try: self.__set_text(self.manager.current.get_description()) self.__set_modified(False) finally: buf.handler_unblock_by_func(self.__on_modify) def on_main_notebook_switch_page(self, notebook, _, page_num): # if I leave the readme tab if notebook.get_current_page() == README_TAB: self.__save_readme() # if I switch to readme tab if page_num == README_TAB: self.__load_readme() super(ReadmeMixin, self).on_main_notebook_switch_page( notebook, _, page_num) def init(self, factory): self.__get_buffer().connect("modified-changed", self.__on_modify) super(ReadmeMixin, self).init(factory) def __cancel_delayed_save(self): if self.__deleyed_call: if self.__deleyed_call.active(): self.__deleyed_call.cancel() self.__deleyed_call = None def __on_modify(self, textbuffer): if not self.__get_modified() and self.__deleyed_call: self.__cancel_delayed_save() if self.__get_modified() and not self.__deleyed_call: self.__deleyed_call = reactor.callLater(30, self.__save_readme) def on_new(self, name): self.__load_readme() super(ReadmeMixin, self).on_new(name) def on_save(self): self.__save_readme() super(ReadmeMixin, self).on_save() def on_open(self, name): self.__load_readme() super(ReadmeMixin, self).on_open(name) def on_quit(self, factory): self.__cancel_delayed_save() self.__save_readme() super(ReadmeMixin, self).on_quit(factory) class ProgressBar: def __init__(self, gui): self.freezer = dialogs.Freezer(gui.set_insensitive, gui.set_sensitive, gui.wndMain) def wait_for(self, something, *args): return self.freezer.wait_for(something, *args) class _Root(object): # This object ensure that super() calls are not forwarded to object. def init(self, factory): pass # Notebook signals def on_main_notebook_switch_page(self, notebook, _, page_num): pass def on_main_notebook_select_page(self, notebook, move_focus): pass def on_main_notebook_change_current_page(self, notebook, offset): pass # VBGUI signals def on_quit(self, factory): pass def on_save(self): pass def on_open(self, name): pass def on_new(self, name): pass class BricksBindingList(widgets.AbstractBindingList): def __init__(self, factory): widgets.AbstractBindingList.__init__(self, factory) factory.connect("brick-added", self._on_added) factory.connect("brick-removed", self._on_removed) factory.connect("brick-changed", self._on_changed) def __dispose__(self): self._factory.disconnect("brick-added", self._on_added) self._factory.disconnect("brick-removed", self._on_removed) self._factory.disconnect("brick-changed", self._on_changed) def __iter__(self): return iter(self._factory.bricks) class EventsBindingList(widgets.AbstractBindingList): def __init__(self, factory): widgets.AbstractBindingList.__init__(self, factory) factory.connect("event-added", self._on_added) factory.connect("event-removed", self._on_removed) factory.connect("event-changed", self._on_changed) def __dispose__(self): self._factory.disconnect("event-added", self._on_added) self._factory.disconnect("event-removed", self._on_removed) self._factory.disconnect("event-changed", self._on_changed) def __iter__(self): return iter(self._factory.events) def is_running_filter(model, itr): brick = model.get_value(itr, 0) if brick: return is_running(brick) class VBGUI(TopologyMixin, ReadmeMixin, _Root): """ The main GUI object for virtualbricks, containing all the configuration for the widgets and the connections to the main engine. """ __bricks_binding_list = None __events_binding_list = None def __init__(self, factory, builder, textbuffer=None): self.factory = self.brickfactory = factory self.builder = builder self.config = settings self.messages_buffer = textbuffer logger.info(start_virtualbricks) self.__initialize_components() factory.connect("brick-changed", self.on_brick_changed) factory.connect("brick-added", self.on_brick_changed) factory.connect("brick-removed", self.on_brick_changed) self.progressbar = ProgressBar(self) if settings.get("systray"): self.start_systray() self.builder.connect_signals(self) task.LoopingCall(self.lRunning.refilter).start(2) self.__state_manager = StateManager() state_add_selection(self.__state_manager, self.tvBricks, self.__brick_selected, _("No brick selected"), self.btnConfigure) state_add_selection(self.__state_manager, self.tvEvents, self.__event_selected, _("No event selected"), self.btnConfigureEvent) self.init(factory) # Check GUI prerequisites self.__complain_on_missing_prerequisites() # attach the quit callback at the end, so it is not called if an # exception is raised before because of a syntax error of another kind # of error factory.connect("quit", self.on_quit) # Show the main window self.wndMain.show() def __initialize_components(self): # bricks tab self.tvBricks.set_cells_data_func() self.__bricks_binding_list = BricksBindingList(self.factory) self.lBricks.set_data_source(self.__bricks_binding_list) self.tvBricks.enable_model_drag_source(gtk.gdk.BUTTON1_MASK, BRICK_DRAG_TARGETS, gtk.gdk.ACTION_LINK) self.tvBricks.enable_model_drag_dest(BRICK_DRAG_TARGETS, gtk.gdk.ACTION_LINK) # events tab self.tvEvents.set_cells_data_func() self.__events_binding_list = EventsBindingList(self.factory) self.lEvents.set_data_source(self.__events_binding_list) # jobs tab self.tvJobs.set_cells_data_func() self.lRunning.set_visible_func(is_running_filter) def __complain_on_missing_prerequisites(self): qmissing, _ = tools.check_missing_qemu(settings.get("qemupath")) vmissing = tools.check_missing_vde(settings.get("vdepath")) missing = vmissing + qmissing if "kvm" in missing: settings.set("kvm", False) if not tools.check_ksm(): settings.set("ksm", False) missing.append("ksm") missing_text = [] missing_components = [] if len(missing) > 0 and settings.show_missing: for m in missing: if m == "kvm": missing_text.append("KVM not found: kvm support" " will be disabled.") elif m == "ksm": missing_text.append("KSM not found in Linux. " "Samepage memory will not work on this " "system.") else: missing_components.append(m) logger.error(components_not_found, text="\n".join(missing_text), components=" ".join(missing_components)) def __dispose__(self): self.factory.disconnect("brick-changed", self.on_brick_changed) self.factory.disconnect("brick-added", self.on_brick_changed) self.factory.disconnect("brick-removed", self.on_brick_changed) if self.__bricks_binding_list is not None: dispose(self.__bricks_binding_list) self.__bricks_binding_list = None if self.__events_binding_list is not None: dispose(self.__events_binding_list) self.__events_binding_list = None def __getattr__(self, name): obj = self.builder.get_object(name) if obj is None: raise AttributeError(name) return obj def get_object(self, name): return self.builder.get_object(name) """ ******************************************************** """ """ Signal handlers """ """ ******************************************************** """ def on_brick_changed(self, brick): self.draw_topology() def curtain_down(self): self.get_object("main_notebook").show() configframe = self.get_object("configframe") configpanel = configframe.get_child() if configpanel: configpanel.destroy() configframe.hide() self.set_title() def curtain_up(self, brick): configframe = self.get_object("configframe") configframe.add(IConfigController(brick).get_view(self)) configframe.show() self.get_object("main_notebook").hide() self.set_title("Virtualbricks (Configuring Brick %s)" % brick.get_name()) def set_title(self, title=None): if title is None: if project.manager.current: name = project.manager.current.name title = _("Virtualbricks (project: {0})").format(name) self.wndMain.set_title(title) else: self.wndMain.set_title(title) """ ******************************************************** """ """ """ """ EVENTS / SIGNALS """ """ """ """ """ """ ******************************************************** """ # Notebook signals def on_main_notebook_switch_page(self, notebook, _, page_num): super(VBGUI, self).on_main_notebook_switch_page(notebook, _, page_num) return True def on_main_notebook_select_page(self, notebook, move_focus): super(VBGUI, self).on_main_notebook_select_page(notebook, move_focus) return True def on_main_notebook_change_current_page(self, notebook, offset): super(VBGUI, self).on_main_notebook_change_current_page(notebook, offset) return True # gui (programming) interface def init(self, factory): super(VBGUI, self).init(factory) def on_quit(self, factory): dispose(self) super(VBGUI, self).on_quit(factory) def on_save(self): super(VBGUI, self).on_save() project.manager.save_current(self.brickfactory) def on_open(self, name): self.on_save() prj = project.manager.get_project(name) prj.open(self.brickfactory) super(VBGUI, self).on_open(name) def on_new(self, name): self.on_save() prj = project.manager.get_project(name) prj.create() prj.open(self.brickfactory) super(VBGUI, self).on_new(name) def do_quit(self, *_): self.factory.quit() return True # end gui (programming) interface def on_wndMain_delete_event(self, window, event): #don't delete; hide instead if settings.get("systray"): window.hide() self.statusicon.set_tooltip("Virtualbricks Hidden") return True def ask_remove_brick(self, brick): self.__ask_for_deletion(self.brickfactory.del_brick, brick) def ask_remove_event(self, event): if event.scheduled is not None: other = _("The event is in use, it will be stopped before.") else: other = None self.__ask_for_deletion(self.brickfactory.del_event, event, other) def __ask_for_deletion(self, on_yes, what, secondary_text=None): question = _("Do you really want to delete %s (%s)?") % ( what.name, what.get_type()) dialog = dialogs.ConfirmDialog(question, on_yes=on_yes, on_yes_arg=what) if secondary_text is not None: dialog.format_secondary_text(secondary_text) dialog.window.set_transient_for(self.wndMain) dialog.show() def on_bricks_treeview_key_release_event(self, treeview, event): if gtk.gdk.keyval_name(event.keyval) in set(["Delete", "BackSpace"]): brick = treeview.get_selected_value() if brick is not None: self.ask_remove_brick(brick) def on_events_treeview_key_release_event(self, treeview, event): if gtk.gdk.keyval_name(event.keyval) in set(["Delete", "BackSpace"]): event = treeview.get_selected_value() if event is not None: self.ask_remove_event(event) # status icon handling def start_systray(self): if not self.statusicon.get_visible(): self.statusicon.set_visible(True) def stop_systray(self): if self.statusicon.get_visible(): self.statusicon.set_visible(False) def window_toggle(self): if self.wndMain.get_visible(): self.wndMain.hide() self.statusicon.set_tooltip(_("Virtualbricks hidden")) else: self.wndMain.show() self.statusicon.set_tooltip(_("Virtualbricks visible")) def on_statusicon_activate(self, statusicon): self.window_toggle() def on_statusicon_popup_menu(self, statusicon, button, time): if button == 3: self.menuSystray.popup(None, None, None, button, time) def on_menuSystrayToggle_activate(self, menuitem): self.window_toggle() # menu items signals def on_menuFileNew_activate(self, menuitem): dialog = dialogs.NewProjectDialog(self) dialog.on_destroy = self.set_title dialog.show(self.wndMain) return True def on_menuFileOpen_activate(self, menuitem): dialog = dialogs.OpenProjectDialog(self) dialog.on_destroy = self.set_title dialog.show(self.wndMain) return True def on_menuFileRename_activate(self, menuitem): dialog = dialogs.RenameProjectDialog(self) dialog.on_destroy = self.set_title dialog.show(self.wndMain) return True def on_menuFileSave_activate(self, menuitem): self.on_save() return True def on_menuFileSaveAs_activate(self, menuitem): self.on_save() dialog = dialogs.SaveAsDialog(self.brickfactory, (prj.name for prj in project.manager)) dialog.show(self.wndMain) return True def on_menuFileImport_activate(self, menuitem): d = dialogs.ImportDialog(self.brickfactory) d.on_destroy = self.set_title d.show(self.wndMain) return True def on_menuFileExport_activate(self, menuitem): self.on_save() dialog = dialogs.ExportProjectDialog(ProgressBar(self), filepath.FilePath(project.manager.current.path), self.brickfactory.disk_images) dialog.show(self.wndMain) return True def on_menuFileDelete_activate(self, menuitem): dialogs.DeleteProjectDialog(self).show(self.wndMain) return True def on_menuSettingsPreferences_activate(self, menuitem): dialogs.SettingsDialog(self).show(self.wndMain) return True def on_menuViewMessages_activate(self, menuitem): dialogs.LoggingWindow(self.messages_buffer).show() return True def on_menuImagesCreate_activate(self, menuitem): dialogs.CreateImageDialog(self, self.brickfactory).show(self.wndMain) return True def on_menuImagesNew_activate(self, menuitem): dialogs.choose_new_image(self, self.brickfactory) return True def on_menuImagesCommit_activate(self, menuitem): dialogs.CommitImageDialog(self.progressbar, self.brickfactory).show( self.wndMain) return True def on_menuImagesLibrary_activate(self, menuitem): dialogs.DisksLibraryDialog(self.brickfactory).show() return True def on_menuHelpAbout_activate(self, menuitem): dialogs.AboutDialog().show(self.wndMain) return True # bricks toolbar def on_btnNewBrick_clicked(self, toolbutton): dialogs.NewBrickDialog(self.brickfactory).show(self.wndMain) return True def on_btnStartAll_clicked(self, toolbutton): def started_all(results): for success, value in results: if not success: logger.failure(not_started, value) l = [brick.poweron() for brick in self.brickfactory.bricks] defer.DeferredList(l, consumeErrors=True).addCallback(started_all) return True def on_btnStopAll_clicked(self, toolbutton): for brick in self.brickfactory.bricks: brick.poweroff() return True def __show_config_if_selected(self, treeview): brick = treeview.get_selected_value() if brick: self.curtain_up(brick) return True return False def on_btnConfigure_clicked(self, toolbutton): return self.__show_config_if_selected(self.tvBricks) # events toolbar def on_btnNewEvent_clicked(self, toolbutton): dialogs.NewEventDialog(self).show(self.wndMain) return True def on_btnStartAllEvents_clicked(self, toolbutton): for event in self.brickfactory.events: event.poweron() return True def on_btnStopAllEvents_clicked(self, toolbutton): for event in self.brickfactory.events: event.poweroff() return True def on_btnConfigureEvent_clicked(self, toolbutton): return self.__show_config_if_selected(self.tvEvents) def confirm(self, message): dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_YES_NO, message) response = dialog.run() dialog.destroy() if response == gtk.RESPONSE_YES: return True elif response == gtk.RESPONSE_NO: return False def on_bricks_treeview_button_release_event(self, treeview, event): if event.button == 3: pthinfo = treeview.get_path_at_pos(int(event.x), int(event.y)) if pthinfo is not None: path, col, cellx, celly = pthinfo treeview.grab_focus() treeview.set_cursor(path, col, 0) model = treeview.get_model() obj = model.get_value(model.get_iter(path), 0) IMenu(obj).popup(event.button, event.time, self) return True def on_events_treeview_button_release_event(self, treeview, event): return self.on_bricks_treeview_button_release_event(treeview, event) def on_bricks_treeview_row_activated(self, treeview, path, column): model = treeview.get_model() brick = model.get_value(model.get_iter(path), 0) self.startstop_brick(brick) def on_events_treeview_row_activated(self, treeview, path, column): model = treeview.get_model() event = model.get_value(model.get_iter(path), 0) event.toggle() def startstop_brick(self, brick): if is_running(brick): brick.poweroff().addErrback(logger.failure_eb, stop_error) else: brick.poweron().addErrback(logger.failure_eb, start_error) def on_joblist_treeview_button_release_event(self, treeview, event): if event.button == 3: pthinfo = treeview.get_path_at_pos(int(event.x), int(event.y)) if pthinfo is not None: path, col, cellx, celly = pthinfo treeview.grab_focus() treeview.set_cursor(path, col, 0) model = treeview.get_model() brick = model.get_value(model.get_iter(path), 0) IJobMenu(brick).popup(event.button, event.time, self) return True def user_wait_action(self, action, *args): return ProgressBar(self).wait_for(action, *args) def user_wait_deferred(self, deferred): return ProgressBar(self).wait_for(deferred) def set_insensitive(self): self.wndMain.set_sensitive(False) def set_sensitive(self): self.wndMain.set_sensitive(True) # Bricks tab signals def on_bricks_treeview_drag_data_get(self, treeview, context, selection, info, time): brick = treeview.get_selected_value() selection.set(selection.target, 8, brick.get_name()) return True def on_bricks_treeview_drag_data_received(self, treeview, context, x, y, selection, info, time): drop_info = treeview.get_dest_row_at_pos(x, y) if drop_info: path, position = drop_info source_brick = self.brickfactory.get_brick_by_name(selection.data) if source_brick: # XXX log debug info model = treeview.get_model() dest_brick = model.get(model.get_iter(path), 0)[0] if dest_brick: if dest_brick is not source_brick: pass if len(source_brick.socks) > 0: dest_brick.connect(source_brick.socks[0]) elif len(dest_brick.socks) > 0: source_brick.connect(dest_brick.socks[0]) else: log.info(dnd_no_socks) else: logger.debug(dnd_same_brick) else: logger.debug(dnd_dest_brick_not_found) else: logger.debug(dnd_source_brick_not_found, name=selection.data) else: logger.debug(dnd_no_dest) context.finish(True, False, time) return True def __brick_selected(self): return bool(self.tvBricks.get_selected_value()) # Events tab signals def on_events_selection_changed(self, selection): self.__state_event_config.check() def __event_selected(self): return bool(self.tvEvents.get_selected_value()) class List(gtk.ListStore): def __init__(self): gtk.ListStore.__init__(self, object) def __iter__(self): i = self.get_iter_first() while i: yield self.get_value(i, 0) i = self.iter_next(i) def append(self, element): gtk.ListStore.append(self, (element, )) def remove(self, element): itr = self.get_iter_first() while itr: el = self.get_value(itr, 0) if el is element: return gtk.ListStore.remove(self, itr) itr = self.iter_next(itr) raise ValueError("%r not in list" % (element, )) def __delitem__(self, key): if isinstance(key, int): gtk.ListStore.__delitem__(self, key) elif isinstance(key, slice): if (key.start in (None, 0) and key.stop in (None, sys.maxint) and key.step in (1, -1, None)): self.clear() else: raise TypeError("Invalid slice %r" % (key, )) else: raise TypeError("Invalid key %r" % (key, )) class VisualFactory(brickfactory.BrickFactory): def __init__(self, quit): brickfactory.BrickFactory.__init__(self, quit) self.socks = List() @implementer(log.ILogObserver) class TextBufferObserver: def __init__(self, textbuffer): textbuffer.create_mark("end", textbuffer.get_end_iter(), False) self.textbuffer = textbuffer def __call__(self, event): gobject.idle_add(self.emit, event) def emit(self, event): entry = "{iso8601_time} [{log_namespace}] {msg}\n{traceback}" if "log_failure" in event: event["traceback"] = event["log_failure"].getTraceback() else: event["traceback"] = "" event["iso8601_time"] = log.format_time(event["log_time"]) msg = entry.format(msg=log.formatEvent(event), **event) mark = self.textbuffer.get_mark("end") iter = self.textbuffer.get_iter_at_mark(mark) self.textbuffer.insert_with_tags_by_name(iter, msg, event["log_level"].name) class MessageDialogObserver: def __init__(self, parent=None): self.__parent = parent def set_parent(self, parent): self.__parent = parent def __call__(self, event): dialog = gtk.MessageDialog(self.__parent, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE) dialog.set_property('text', log.formatEvent(event)) dialog.connect("response", lambda d, r: d.destroy()) dialog.show() def should_show_to_user(event): if "hide_to_user" in event or event["log_level"] != log.LogLevel.error: return log.PredicateResult.no return log.PredicateResult.maybe TEXT_TAGS = [('debug', {'foreground': '#a29898'}), ('info', {}), ('warn', {'foreground': '#ff9500'}), ('error', {'foreground': '#b8032e'})] def AppLoggerFactory(textbuffer): observer = TextBufferObserver(textbuffer) class AppLogger(brickfactory.AppLogger): def start(self, application): logger.publisher.addObserver(observer) brickfactory.AppLogger.start(self, application) def stop(self): logger.publisher.removeObserver(observer) brickfactory.AppLogger.stop(self) return AppLogger class Application(brickfactory.Application): factory_factory = VisualFactory def __init__(self, config): self.textbuffer = gtk.TextBuffer() for name, attrs in TEXT_TAGS: self.textbuffer.create_tag(name, **attrs) self.logger_factory = AppLoggerFactory(self.textbuffer) brickfactory.Application.__init__(self, config) def get_namespace(self): return {"gui": self.gui} def _run(self, factory): # a bug in gtk2 make impossibile to use this and is not required anyway gtk.set_interactive(False) builder = load_ui() message_dialog = MessageDialogObserver() observer = log.FilteringLogObserver(message_dialog, (should_show_to_user,)) logger.publisher.addObserver(observer, False) # disable default link_button action gtk.link_button_set_uri_hook(lambda b, s: None) self.gui = VBGUI(factory, builder, self.textbuffer) message_dialog.set_parent(self.gui.wndMain) def run(self, reactor): ret = brickfactory.Application.run(self, reactor) self.gui.set_title() return ret def load_ui(): try: builder = gtk.Builder() builder.set_translation_domain("virtualbricks") source = graphics.get_data_filename("virtualbricks.ui") builder.add_from_file(source) return builder except: raise SystemExit("Cannot load glade file") virtualbricks-1.0.2/virtualbricks/gui/help.py000066400000000000000000000042651262207653100213630ustar00rootroot00000000000000import os import errno import re import gtk from zope.interface import implementer from virtualbricks.gui import graphics, interfaces __metaclass__ = type class HelpError(Exception): pass class NoHelpFoundError(HelpError): pass class UnknonwHelpError(HelpError): pass class HelpWindow: def __init__(self): self.window = window = gtk.Window() window.set_resizable(True) window.set_size_request(350, 300) window.set_title("Virtualbricks - help") textview = gtk.TextView() textview.set_editable(False) textview.set_cursor_visible(False) textview.set_wrap_mode(gtk.WRAP_WORD) self.textbuffer = textview.get_buffer() sw = gtk.ScrolledWindow() sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) sw.add(textview) window.add(sw) window.show_all() def do_destroy(self, window): self.window = None def set_text(self, text): self.textbuffer.set_text(text) def on_destroy(self, callable, *args): self.window.connect("destroy", callable, *args) def present(self): self.window.present() @implementer(interfaces.IHelp) class Help: RE = re.compile("^(\w+)_help_button$") window_factory = HelpWindow window = None def get_help(self, argument): try: path = os.path.join("help", argument + ".txt") with open(graphics.get_data_filename(path)) as fp: return fp.read() except IOError as e: if e.errno == errno.ENOENT: raise NoHelpFoundError(argument) raise UnknonwHelpError(e) def destroy_window(self, window): self.window = None def show_help_window(self, text): window = self.window if not window: self.window = window = self.window_factory() window.on_destroy(self.destroy_window) window.set_text(text) window.present() return window def on_help_button_clicked(self, button): match = self.RE.match(gtk.Buildable.get_name(button)) if match: self.show_help_window(self.get_help(match.group(1))) return True virtualbricks-1.0.2/virtualbricks/gui/interfaces.py000066400000000000000000000061511262207653100225520ustar00rootroot00000000000000# Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from zope.interface import Interface, Attribute from virtualbricks.interfaces import registerAdapter __all__ = ["registerAdapter", "IMenu", "IJobMenu", "IConfigController", "IState", "IControl", "IStateManager"] class IMenu(Interface): def popup(button, time): """Pop up a menu for a specific brick.""" class IJobMenu(IMenu): pass class IConfigController(Interface): def get_view(gui): """Return the configuration panel for the given brick or event.""" def configure_brick(gui): """Configure the brick as setted in the panel.""" class IPrerequisite(Interface): def __call__(): """ @return: YES, NO or MAYBE if the prerequisite is satisfied. @rtype: C{bool} """ class IState(Interface): """An object that check all prerequisites and manage the controls.""" def add_prerequisite(prerequisite): """ Add a prerequisite. @param prerequisite: A prerequisite. @type prerequisite: L{IPrerequisite} """ def add_control(control): """ Add a control. @param control: The control. @type contro: L{IControl} """ class IControl(Interface): """Control a widget.""" def react(enable): """ Adjust a widget based on the result of the prerequisites. @param enable: C{True} if the widget should be enabled or C{False} otherwise. @type enable: C{bool} """ class IStateManager(Interface): """A collection of states.""" def add_state(state): """ Add a state to the collection. @param state: the state to add. @type state: L{IState} """ class IHelp(Interface): def get_help(argument): """Return the help for the given argument or raise an exception.""" def show_help_window(text): """Show the help window with the text specified.""" def on_help_button_clicked(button): """ Callback that can be used to open the help window and show the help based on the name of the button. """ class IBindingList(Interface): changed = Attribute("IEvent, emitted when an item is changed") added = Attribute("IEvent, emitted when an item is added") removed = Attribute("IEvent, emitted when an item is removed") virtualbricks-1.0.2/virtualbricks/gui/widgets.py000066400000000000000000000300271262207653100220740ustar00rootroot00000000000000from zope.interface import implementer import gobject import gtk from virtualbricks import observable from virtualbricks.tools import dispose from virtualbricks.gui import interfaces, graphics if False: _ = str # make pyflakes happy try: _ except NameError: # needed to support glade _ = str def set_cells_data_func(column): for cell in column.get_cell_renderers(): column.set_cell_data_func(cell, cell.set_cell_data) class CellRendererFormattable(gtk.CellRendererText): __gtype_name__ = "CellRendererFormattable" __gproperties__ = { "formatting-enabled": ( gobject.TYPE_BOOLEAN, _("Enable formatting"), _("Whether enable formatting"), False, gobject.PARAM_READWRITE ), "format-string": ( gobject.TYPE_STRING, _("Format string"), _("The format string understand by the builtin format()"), "", gobject.PARAM_READWRITE ), "formatter": ( gobject.TYPE_PYOBJECT, _("Custom formatter"), _("An instance of string.Formatter() class"), gobject.PARAM_READWRITE ), "display-member": ( gobject.TYPE_STRING, _("Display member"), _("The member used to display the text"), "", gobject.PARAM_READWRITE ) } _formatting_enabled = False _format_string = "" _formatter = None _display_member = "" def do_get_property(self, pspec): if pspec.name == "formatting-enabled": return self._formatting_enabled elif pspec.name == "format-string": return self._format_string elif pspec.name == "formatter": return self._formatter elif pspec.name == "display-member": return self._display_member else: raise TypeError("Unknown property %r" % (pspec.name, )) def do_set_property(self, pspec, value): if pspec.name == "formatting-enabled": self._formatting_enabled = value elif pspec.name == "format-string": self._format_string = value elif pspec.name == "formatter": self._formatter = value elif pspec.name == "display-member": self._display_member = value else: raise TypeError("Unknown property %r" % (pspec.name, )) @staticmethod def set_cell_data(cell_layout, cell, model, itr, data=None): obj = model.get_value(itr, 0) if cell._formatting_enabled: if cell._formatter is not None: text = cell._formatter.format(cell._format_string, obj) else: text = format(obj, cell._format_string) elif cell._display_member and obj is not None: text = str(getattr(obj, cell._display_member)) else: text = str(obj) cell.set_property("text", text) set_text = set_cell_data class CellRendererBrickIcon(gtk.CellRendererPixbuf): __gtype_name__ = "CellRendererBrickIcon" @staticmethod def set_cell_data(cell_layout, cell, model, itr, data=None): brick = model.get_value(itr, 0) pixbuf = graphics.pixbuf_for_brick_at_size(brick, 48, 48) cell.set_property("pixbuf", pixbuf) SELECT_ALL = object() SELECT_NONE = object() class List(gtk.ListStore): __gtype_name__ = "List" __gproperties__ = { "value-member": ( gobject.TYPE_STRING, _("Value member"), _(""), "", gobject.PARAM_READWRITE ), } _value_member = "" _ibinding_list = None def __init__(self): gtk.ListStore.__init__(self, gobject.TYPE_PYOBJECT) def do_get_property(self, pspec): if pspec.name == "value-member": return self._value_member else: raise TypeError("Unknown property %r" % (pspec.name, )) def do_set_property(self, pspec, value): if pspec.name == "value-member": self._value_member = value else: raise TypeError("Unknown property %r" % (pspec.name, )) def set_data_source(self, lst): dispose(self) self.clear() for item in lst: self.append((item, )) if interfaces.IBindingList.providedBy(lst): self._ibinding_list = lst lst.added.connect(self.on_add) lst.removed.connect(self.on_remove) lst.changed.connect(self.on_changed) def on_add(self, value): self.append((value, )) def on_remove(self, value): mbr = self._value_member itr = self.get_iter_first() while itr: obj = self.get_value(itr, 0) if (mbr and getattr(obj, mbr) == value) or obj == value: self.remove(itr) return itr = self.iter_next(itr) def on_changed(self, value): mbr = self._value_member itr = self.get_iter_first() while itr: obj = self.get_value(itr, 0) if (mbr and getattr(obj, mbr) == value) or obj == value: self.row_changed(self.get_path(itr), itr) itr = self.iter_next(itr) def __dispose__(self): if self._ibinding_list is not None: dispose(self._ibinding_list) self._ibinding_list = None @implementer(interfaces.IBindingList) class AbstractBindingList: def __init__(self, factory): self._factory = factory self._observable = observable.Observable("added", "removed", "changed") self.added = observable.Event(self._observable, "added") self.removed = observable.Event(self._observable, "removed") self.changed = observable.Event(self._observable, "changed") def _on_added(self, obj): self._observable.notify("added", obj) def _on_removed(self, obj): self._observable.notify("removed", obj) def _on_changed(self, obj): self._observable.notify("changed", obj) class ImagesBindingList(AbstractBindingList): def __init__(self, factory): AbstractBindingList.__init__(self, factory) factory.connect("image-added", self._on_added) factory.connect("image-removed", self._on_removed) factory.connect("image-changed", self._on_changed) def __dispose__(self): self._factory.disconnect("image-added", self._on_added) self._factory.disconnect("image-removed", self._on_removed) self._factory.disconnect("image-changed", self._on_changed) def __iter__(self): return iter(self._factory.disk_images) class TreeView(gtk.TreeView): __gtype_name__ = "TreeView" def get_selection_mode(self): return self.get_selection().get_mode() def set_selection_mode(self, value): self.get_selection().set_mode(value) def get_selected_value(self): mode = self.get_selection().get_mode() if mode in (gtk.SELECTION_NONE, gtk.SELECTION_SINGLE, gtk.SELECTION_BROWSE): values = self.get_selected_values() if values: return values[0] return None raise ValueError("Invalid selection mode") def set_selected_value(self, value): if value is SELECT_ALL: raise ValueError("Cannot select more than one node") elif self.get_selection().get_mode() == gtk.SELECTION_NONE: raise ValueError("Cannot select any node") else: self.set_selected_values((value, )) def get_selected_values(self): selection = self.get_selection() mode = selection.get_mode() if mode == gtk.SELECTION_NONE: return () elif mode in (gtk.SELECTION_SINGLE, gtk.SELECTION_BROWSE): model, itr = selection.get_selected() if itr is None: return () try: mbr = model.get_property("value-member") if not mbr: raise TypeError except TypeError: return (model.get_value(itr, 0), ) else: return (getattr(model.get_value(itr, 0), mbr), ) else: model, paths = selection.get_selected_rows() try: mbr = model.get_property("value-member") if not mbr: raise TypeError except TypeError: return tuple(model.get_value(model.get_iter(path), 0) for path in paths) else: return tuple(getattr(model.get_value(model.get_iter(path), 0), mbr) for path in paths) def set_selected_values(self, iterable): selection = self.get_selection() mode = selection.get_mode() if iterable is SELECT_ALL: if mode != gtk.SELECTION_MULTIPLE: raise ValueError("Cannot select all the nodes") selection.select_all() elif iterable is SELECT_NONE: selection.unselect_all() elif mode == gtk.SELECTION_NONE: raise ValueError("Cannot select any node") else: model = self.get_model() selection.unselect_all() try: mbr = model.get_property("value-member") if not mbr: raise TypeError except TypeError: for value in iterable: itr = model.get_iter_first() while itr: obj = model.get_value(itr, 0) if obj == value: selection.select_iter(itr) itr = model.iter_next(itr) else: for value in iterable: itr = model.get_iter_first() while itr: obj = model.get_value(itr, 0) if getattr(obj, mbr) == value: selection.select_iter(itr) itr = model.iter_next(itr) def set_cells_data_func(self): for column in self.get_columns(): set_cells_data_func(column) class ListEntry: def __init__(self, value, label): self.value = value self.label = label @classmethod def from_tuple(cls, pair): return cls(*pair) def __format__(self, format_string): if format_string == "l": return str(self.label) elif format_string in ("v", ""): return str(self.value) raise ValueError("Invalid format string " + repr(format_string)) def __eq__(self, other): if not isinstance(other, self.__class__): return NotImplemented return self.value == other.value and self.label == other.label def __ne__(self, other): if not isinstance(other, self.__class__): return NotImplemented return not self.__eq__(other) class ComboBox(gtk.ComboBox): __gtype_name__ = "ComboBox" def get_selected_value(self): model = self.get_model() itr = self.get_active_iter() if itr: obj = model.get_value(itr, 0) try: member = model.get_property("value-member") if not member: return obj except TypeError: return obj else: return getattr(obj, member) def set_selected_value(self, value): model = self.get_model() itr = model.get_iter_first() try: mbr = model.get_property("value-member") if not mbr: raise TypeError except TypeError: while itr: obj = model.get_value(itr, 0) if obj == value: self.set_active_iter(itr) break itr = model.iter_next(itr) else: while itr: obj = model.get_value(itr, 0) if getattr(obj, mbr) == value: self.set_active_iter(itr) break itr = model.iter_next(itr) virtualbricks-1.0.2/virtualbricks/interfaces.py000066400000000000000000000074251262207653100217730ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_factory -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import traceback from zope.interface import Interface, Attribute from twisted.python.components import registerAdapter from virtualbricks import log __all__ = ["registerAdapter", "InterfaceLogger", "IBrick", "IPlug", "IBuilder"] logger = log.Logger() non_interface = log.Event("Requested a non-interface ({interface}) method: " "{method}\n{traceback}") class InterfaceLogger: def __init__(self, original, interface): self.original = original self.interface = interface def __getattr__(self, name): if name not in self.interface: tb = lambda: "\n".join("{0}:{1} {2}".format(fn, l, fun) for fn, l, fun, t in reversed(traceback.extract_stack())) logger.warn(non_interface, interface=self.interface.__name__, method=name, traceback=tb) try: return getattr(self.original, name) except AttributeError: raise AttributeError(name) class IBrick(Interface): type = Attribute("The type name of the brick") name = Attribute("The name of the brick") proc = Attribute("""None or an object conform to \ C{twisted.internet.interfaces.IProcessTransport""") def get_type(): """Return the type of brick.""" def poweron(): """Start the brick. Return a deferred that fires when the brick is started.""" def poweroff(): """Stop the brick. Return a deferred that fires when the brick is stopped.""" def get_parameters(): """Actually used only in the main tree to show the list of the parameters""" # XXX: remove this method def configure(attrlist): """Configure the brick""" def __eq__(other): """Compare two bricks""" # XXX: maybe should use is keyword? # to be controlled config_socks = Attribute("") socks = Attribute("") plugs = Attribute("") def connect(endpoint): pass def get_state(): pass class IPlug(Interface): def connected(): """Check if the plug is properly connected and try to start the related bricks if it is not. Return a deferred that fires when the related are started.""" class IBuilder(Interface): def load_from(factory, item): """Return a new brick or link from the given item.""" class IProcess(Interface): """A class representing a process.""" pid = Attribute("The exit value of the process. C{None} if process is not " "termiated, C{int} otherwise.") def signal_process(signo): """ Send a signal to the given process. @param signo: the signal to send to the process. @type signo: C{int} or one of "TERM", "KILL" or "INT" """ def write(data): """Send data to the stdin of the process. @type data: C{str} """ virtualbricks-1.0.2/virtualbricks/link.py000066400000000000000000000063361262207653100206050ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_link -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os from twisted.internet import defer from virtualbricks import errors, settings, log if False: # pyflakes _ = str __metaclass__ = type link_loop = log.Event("Loop link detected: aborting operation. If you want " "to start a looped network, disable the check loop " "feature in the general settings") class Plug: sock = None _antiloop = False mode = "vde" logger = log.Logger() model = "" mac = "" def __init__(self, brick): self.brick = brick def configured(self): return self.sock is not None def connected(self): if self._antiloop: if settings.get("erroronloop"): self.logger.error(link_loop) self._antiloop = False return defer.fail(errors.LinkLoopError()) self._antiloop = True if self.sock is None or self.sock.brick is None: self._antiloop = False return defer.fail(errors.NotConnectedError()) # special case where a brick (vm) is plugged to itself: # brick -> plug -> sock <- brick if self.sock.brick is self.brick: self._antiloop = False return defer.succeed(self.brick) def clear_antiloop(passthru): self._antiloop = False return passthru d = self.sock.brick.poweron() d.addBoth(clear_antiloop) return d def connect(self, sock): assert sock is not None, "Cannot connect a plug to nothing" sock.plugs.append(self) self.sock = sock def disconnect(self): assert self.sock is not None, "Plug not connected" assert self in self.sock.plugs, \ "sock %r has not reference to %r" % (self.sock, self) self.sock.plugs.remove(self) self.sock = None def save_to(self, fileobj): tmp = "link|{0.brick.name}|{1}|{0.model}|{0.mac}\n" fileobj.write(tmp.format(self, self.sock.nickname if self.configured() else "")) class Sock: def __init__(self, brick, name=""): self.brick = brick self.path = name self.nickname = name self.plugs = [] self.mode = "sock" def get_free_ports(self): return self.brick.config["numports"] - len(self.plugs) def has_valid_path(self): return os.access(os.path.dirname(self.path), os.W_OK) virtualbricks-1.0.2/virtualbricks/log.py000066400000000000000000000207231262207653100204250ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_log -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import time from datetime import datetime import inspect import urllib import uuid import functools from twisted.python import util, failure from virtualbricks._log import (InvalidLogLevelError, LogLevel, formatEvent, Logger as _Logger, LegacyLogger, ILogObserver, ILegacyLogObserver, LogPublisher, PredicateResult, ILogFilterPredicate, FilteringLogObserver, LogLevelFilterPredicate, LegacyLogObserver, replaceTwistedLoggers) __all__ = ["Event", "Logger", "InvalidLogLevelError", "LogLevel", "formatEvent", "Logger", "LegacyLogger", "ILogObserver", "ILegacyLogObserver", "LogPublisher", "PredicateResult", "ILogFilterPredicate", "FilteringLogObserver", "LogLevelFilterPredicate", "LegacyLogObserver", "replaceTwistedLoggers"] def make_id(log_format, module=None): if module is None: module = inspect.currentframe().f_back.f_back.f_globals["__name__"] params = urllib.urlencode(dict(format=log_format, module=module)) uri = "http://virtualbricks.eu/ns/log/?" + params return uuid.uuid5(uuid.NAMESPACE_URL, uri) class Event(object): def __init__(self, log_format, log_id=None, module=None): self.log_format = log_format if log_id is None: log_id = make_id(log_format, module) self.log_id = log_id def __call__(self, logger, level, **kwds): logger.emit(level, self.log_format, log_id=self.log_id, **kwds) def tap(self, observer, publisher): filtered = FilteringLogObserver(observer, (self.is_,)) publisher.addObserver(filtered, False) return lambda: publisher.removeObserver(filtered) def is_(self, event): if "log_id" in event and event["log_id"] == self.log_id: return PredicateResult.yes return PredicateResult.no def __hash__(self): return int(self.log_id) def expect_event(func): @functools.wraps(func) def wrapper(self, event, *args, **kwds): if isinstance(event, str): event = Event(event) return func(self, event, *args, **kwds) return wrapper class Logger(_Logger): @expect_event def debug(self, event, **kwds): event(self, LogLevel.debug, **kwds) @expect_event def info(self, event, **kwds): event(self, LogLevel.info, **kwds) @expect_event def warn(self, event, **kwds): event(self, LogLevel.warn, **kwds) @expect_event def error(self, event, **kwds): event(self, LogLevel.error, **kwds) @expect_event def exception(self, event, **kwds): event(self, LogLevel.error, log_failure=failure.Failure(), **kwds) @expect_event def failure(self, event, log_failure=None, **kwargs): if log_failure is None: log_failure = failure.Failure() event(self, LogLevel.error, log_failure=log_failure, **kwargs) def failure_eb(self, failure, event, reraise=False, **kwargs): self.failure(event, failure, **kwargs) if reraise: return failure def log_failure(self, deferred, event, **kwargs): def log(failure): self.failure(event, failure, **kwargs) return failure return deferred.addErrback(log) def getTimezoneOffset(when): """ Return the current local timezone offset from UTC. @type when: C{int} @param when: POSIX (ie, UTC) timestamp for which to find the offset. @rtype: C{int} @return: The number of seconds offset from UTC. West is positive, east is negative. """ offset = datetime.utcfromtimestamp(when) - datetime.fromtimestamp(when) return offset.days * (60 * 60 * 24) + offset.seconds def format_time(when): """ Format the given UTC value as a string representing that time in the local timezone. By default it's formatted as a ISO8601-like string (ISO8601 date and ISO8601 time separated by a space). It can be customized using the C{timeFormat} attribute, which will be used as input for the underlying C{time.strftime} call. @type when: C{int} @param when: POSIX (ie, UTC) timestamp for which to find the offset. @rtype: C{str} """ tzOffset = -getTimezoneOffset(when) when = datetime.utcfromtimestamp(when + tzOffset) tzHour = abs(int(tzOffset / 60 / 60)) tzMin = abs(int(tzOffset / 60 % 60)) if tzOffset < 0: tzSign = "-" else: tzSign = "+" return "%d-%02d-%02d %02d:%02d:%02d%s%02d%02d" % ( when.year, when.month, when.day, when.hour, when.minute, when.second, tzSign, tzHour, tzMin) class FileLogObserver: """ Log observer that writes to a file-like object. @type timeFormat: C{str} or C{NoneType} @ivar timeFormat: If not C{None}, the format string passed to strftime(). """ timeFormat = None def __init__(self, f): self.write = f.write self.flush = f.flush def format_time(self, when): if self.timeFormat is not None: return time.strftime(self.timeFormat, time.localtime(when)) return format_time(when) def __call__(self, event): text = formatEvent(event) timeStr = self.format_time(event["log_time"]) fmtDict = {"system": event["log_namespace"], "text": text.replace("\n", "\n\t"), "log_format": "[{system}] {text}\n"} msgStr = formatEvent(fmtDict) if "log_failure" in event: msgStr += event["log_failure"].getTraceback() util.untilConcludes(self.write, timeStr + " " + msgStr) util.untilConcludes(self.flush) # Hoorj! def format_traceback(event): if "log_failure" in event: return event["log_failure"].getTraceback() return "" import logging class StdLoggingAdapter(logging.Handler): logger = Logger() levels = { "DEBUG": LogLevel.debug, "INFO": LogLevel.info, "WARNING": LogLevel.warn, "ERROR": LogLevel.error, "CRITICAL": LogLevel.error } def emit(self, record): kw = dict(("rec_" + k, v) for k, v in record.__dict__.items()) kw["log_record"] = True event = Event(self.format(record), module="virtualbricks.log.std") if record.exc_info is not None: tpe, value, tb = record.exc_info self.logger.failure(event, failure.Failure(value, tpe, tb), **kw) else: try: level = self.levels[record.levelname] except KeyError: if record.levelno < logging.DEBUG: level = LogLevel.debug elif record.levelno < logging.INFO: level = LogLevel.info elif record.levelno < logging.WARNING: level = LogLevel.warn else: level = LogLevel.error event(self.logger, level, **kw) class LegacyAdapter: logger = Logger() levels = { "DEBUG": LogLevel.debug, "INFO": LogLevel.info, "WARNING": LogLevel.warn, "ERROR": LogLevel.error, "CRITICAL": LogLevel.error } def __call__(self, event): if "log_id" in event: # don't play ping pong with the LegacyLogObserver return if isinstance(event["message"], basestring): msg = event["message"] else: msg = "\n".join(event["message"]) ev = Event(msg, module="virtualbricks.log.legacy") if event["isError"]: fail = event.get("failure") if fail: self.logger.failure(ev, log_failure=fail, **event) else: self.logger.error(ev, **event) else: self.logger.info(ev, **event) virtualbricks-1.0.2/virtualbricks/observable.py000066400000000000000000000044351262207653100217720ustar00rootroot00000000000000# Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team class Observable: thawed = False def __init__(self, *names): self.__events = {} for name in names: self.add_event(name) def set_thaw(self, value): self.thawed = value def add_event(self, name): if name in self.__events: raise ValueError("Event %s already present" % name) self.__events[name] = [] def add_observer(self, name, callback, args, kwds): if name not in self.__events: raise ValueError("Event %s not present" % name) if not callable(callback): raise TypeError("%r is not callable" % (callback, )) self.__events[name].append((callback, args, kwds)) def remove_observer(self, name, callback, args, kwds): if name not in self.__events: raise ValueError("Event %s not present" % name) if not callable(callback): raise TypeError("%r is not callable" % (callback, )) self.__events[name].remove((callback, args, kwds)) def notify(self, name, emitter): if name not in self.__events: raise ValueError("Event %s not present" % name) if not self.thawed: for callback, args, kwds in self.__events[name]: callback(emitter, *args, **kwds) def __len__(self): return len(self.__events) def __bool__(self): return bool(self.__events) class Event: def __init__(self, observable, name): self.__observable = observable self.__name = name def connect(self, callback, *args, **kwds): if not callable(callback): raise TypeError("%r is not callable" % (callback, )) self.__observable.add_observer(self.__name, callback, args, kwds) def disconnect(self, callback, *args, **kwds): if not callable(callback): raise TypeError("%r is not callable" % (callback, )) self.__observable.remove_observer(self.__name, callback, (), {}) class thaw: def __init__(self, observable): self.observable = observable def __enter__(self): self.observable.set_thaw(True) def __exit__(self, exc_type, exc_value, traceback): self.observable.set_thaw(False) virtualbricks-1.0.2/virtualbricks/project.py000066400000000000000000000362111262207653100213110ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_project -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import errno import itertools import re from twisted.internet import utils, error, defer from twisted.python import filepath from virtualbricks import (settings, configfile, log, errors, configparser, tools) logger = log.Logger() __metaclass__ = type create_archive = log.Event("Create archive in {path}") extract_archive = log.Event("Extract archive in {path}") open_project = log.Event("Restoring project {name}") import_project = log.Event("Importing project from {path} as {name}") create_project = log.Event("Create project {name}") write_project = log.Event("Writing new .project file") rebase_error = log.Event("Error on rebase") rebase = log.Event("Rebasing {cow} to {basefile}") remap_image = log.Event("Mapping {original} to {new}") extract_project = log.Event("Extracting project") cannot_find_project = log.Event("Cannot find project \"{name}\". " "A new project will be created.") include_images = log.Event("Including the following images to the project: " "{images}.") save_images = log.Event("Move virtual machine's images") DEFAULT_PROJECT_RE = re.compile(r"^{0}(?:_\d+)?$".format( settings.DEFAULT_PROJECT)) def _complain_on_error(result): out, err, code = result if code != 0: logger.warn(err) raise error.ProcessTerminated(code) logger.info(err) return result class Tgz: exe_c = exe_x = "tar" def create(self, pathname, files, images=(), run=utils.getProcessOutputAndValue): logger.info(create_archive, path=pathname) args = ["cfzh", pathname, "-C", settings.VIRTUALBRICKS_HOME] + files if images: logger.info(include_images, images=images) prjpath = filepath.FilePath(settings.VIRTUALBRICKS_HOME) imgs = prjpath.child(".images") try: imgs.remove() except OSError as e: if e.errno != errno.ENOENT: return defer.fail(e) imgs.makedirs() for name, image in images: fp = filepath.FilePath(image) if fp.exists(): link = imgs.child(name) fp.linkTo(link) args.append("/".join(link.segmentsFrom(prjpath))) d = run(self.exe_c, args, os.environ) d.addCallback(_complain_on_error) if images: d.addBoth(pass_through(imgs.remove)) return d def extract(self, pathname, destination, run=utils.getProcessOutputAndValue): logger.info(extract_archive, path=destination) args = ["Sxfz", pathname, "-C", destination] d = run(self.exe_x, args, os.environ) return d.addCallback(_complain_on_error) class BsdTgz(Tgz): exe_c = exe_x = "bsdtar" class ProjectEntry: def __init__(self, sections, links): self.sections = sections self.links = links @classmethod def from_fileobj(cls, fileobj): links = [] sections = {} for item in configparser.Parser(fileobj): if isinstance(item, tuple): links.append(item) else: sections[(item.type, item.name)] = dict(item) return cls(sections, links) def _filter(self, fltr): return [(s, self.sections[s]) for s in self.sections if fltr(s)] def has_image(self, name): return ("Image", name) in self.sections def get_images(self): return self._filter(lambda k: k[0] == "Image") def remap_image(self, name, path): if self.has_image(name): self.sections[("Image", name)]["path"] = path def get_bricks(self): # XXX: every time a new brick type is added or a a type is changed this # method must change too. fix this bricks = set(["Qemu", "Switch", "SwitchWrapper", "Tap", "Capture", "Wirefilter", "Netemu", "Wire", "TunnelConnect", "TunnelListen", "Router"]) return self._filter(lambda k: k[0] in bricks) def get_events(self): return self._filter(lambda k: k[0] == "Event") def get_virtualmachines(self): return self._filter(lambda k: k[0] == "Qemu") def get_disks(self): disks = {} for header, section in self.get_virtualmachines(): for dev in "hda", "hdb", "hdc", "hdd", "fda", "fdb", "mtdblock": if dev in section: disks.setdefault(header[1], []).append((dev, section[dev])) return disks def device_for_image(self, name): for (typ, vmname), section in self.get_virtualmachines(): for dev in "hda", "hdb", "hdc", "hdd", "fda", "fdb", "mtdblock": if dev in section and section[dev] == name: yield vmname, dev def _dump_section(self, fileobj, header, section): fileobj.write("[{0[0]}:{0[1]}]\n".format(header)) for name in section: fileobj.write("{0} = {1}\n".format(name, section[name])) fileobj.write("\n") def dump(self, fileobj): for header, section in self.get_images(): self._dump_section(fileobj, header, section) for header, section in self.get_events(): self._dump_section(fileobj, header, section) for header, section in self.get_bricks(): self._dump_section(fileobj, header, section) for link in self.links: fileobj.write("{0}\n".format("|".join(link))) def save(self, project): with project._project.open("w") as fp: self.dump(fp) def pass_through(function, *args, **kwds): def wrapper(arg): function(*args, **kwds) return arg return wrapper class Project: _description = None _description_modified = False def __init__(self, path, manager): if isinstance(path, basestring): path = filepath.FilePath(path) self._path = path self._manager = manager @property def path(self): return self._path.path @property def name(self): return self._path.basename() @property def _project(self): return self._path.child(".project") def delete(self): try: self._path.remove() except OSError as e: if e.errno != errno.ENOENT: raise def open(self, factory, settings=settings): if self._manager.current == self: return if not self.exists(): raise errors.ProjectNotExistsError(self.name) self.close(factory, settings) logger.debug(open_project, name=self.name) # save the old setting parameters # Bug #1410679 old_proj = settings.get("current_project") old_vbhome = settings.VIRTUALBRICKS_HOME # save new setting parameters # Bug #1410679 settings.set("current_project", self.name) settings.VIRTUALBRICKS_HOME = self.path settings.store() try: configfile.restore(factory, self._project.path) except EnvironmentError as e: # if an exception is raised then revert settings to the # default values # Bug #1410679 settings.set("current_project", old_proj) settings.VIRTUALBRICKS_HOME = old_vbhome settings.store() if e.errno in (errno.ENOENT, errno.ENOTDIR): raise errors.ProjectNotExistsError(self.name) raise # if an exception is raised, this value is not changed, i.e. it # is the default self._manager.current = self return self def close(self, factory, settings=settings): factory.reset() if self._manager.current: self._manager.current = None settings.VIRTUALBRICKS_HOME = settings.DEFAULT_HOME def create(self, overwrite=False): try: self._path.makedirs() except OSError as e: if e.errno == errno.EEXIST: if overwrite: self.delete() return self.create() raise errors.ProjectExistsError(self.name) raise self._project.touch() logger.debug(create_project, name=self.name) return self def exists(self): try: self.create().delete() return False except errors.ProjectExistsError: return True def save(self, factory, _avoid_lop=False): try: configfile.save(factory, self._project.path) except IOError as e: if e.errno == errno.ENOENT: if not _avoid_lop: self.create() return self.save(factory, True) raise if self._description_modified: self._path.child("README").setContent(self._description) self._description_modified = False def save_as(self, name, factory): if name == self.name: return self.save(factory) prj = self._manager.get_project(name) prj.create() dst = filepath.FilePath(prj.path) dst.remove() tools.copyTo(self._path, dst) return prj copy = save_as def rename(self, name, overwrite=False, settings=settings): if name == self.name: return new_prj = self._manager.get_project(name) new_prj.create(overwrite) new_path = filepath.FilePath(new_prj.path) new_path.remove() self._path.moveTo(new_path) self._path = new_path if self == self._manager.current: settings.set("current_project", self.name) settings.VIRTUALBRICKS_HOME = self.path settings.store() def get_description(self): if self._description is None: try: self._description = self._path.child("README").getContent() except IOError as e: if e.errno != errno.ENOENT: raise self._description = "" return self._description def set_description(self, text): self._description = text self._description_modified = True def files(self): return (fp for fp in self._path.walk() if fp.isfile()) def get_descriptor(self): with self._project.open() as fp: return ProjectEntry.from_fileobj(fp) def images(self): path = self._path.child(".images") if path.isdir(): return path.listdir() return () def __eq__(self, other): if not isinstance(other, self.__class__): return NotImplemented return self.name == other.name and self.path == other.path def __ne__(self, other): if not isinstance(other, self.__class__): return NotImplemented return not self.__eq__(other) def __hash__(self): return hash(self._path) def __repr__(self): return "".format(self) class ProjectManager: archive = BsdTgz() current = None project_factory = Project def __init__(self, path=None): if path is None: path = settings.get("workspace") self._path = filepath.FilePath(path) try: self._path.makedirs() except OSError as e: if e.errno != errno.EEXIST: raise @property def path(self): return self._path.path def get_project(self, name): try: path = self._path.child(name) return self.project_factory(path, self) except filepath.InsecurePath: raise errors.InvalidNameError(name) def __iter__(self): for path in self._path.children(): if path.child(".project").isfile(): yield self.project_factory(path, self) def import_prj(self, name, vbppath): project = self.get_project(name) try: project.create() except Exception as e: return defer.fail(e) logger.debug(extract_project) deferred = self.archive.extract(vbppath, project.path) return deferred.addCallback(lambda _: project) def export(self, output, files, images=()): return self.archive.create(output, files, images) def save_current(self, factory): if self.current: self.current.save(factory) def restore_last(self, factory, settings=settings): """Restore the last project if found or create a new one.""" try: os.makedirs(os.path.join(settings.get("workspace"), "vimages")) except OSError as e: if e.errno != errno.EEXIST: raise name = settings.get("current_project") project = self.get_project(name) try: return project.open(factory, settings) except errors.ProjectNotExistsError: if DEFAULT_PROJECT_RE.match(name): project.create(name) project.open(factory, settings) return project else: logger.error(cannot_find_project, name=name) for i in itertools.count(): name = "{0}_{1}".format(settings.DEFAULT_PROJECT, i) project = self.get_project(name) try: project.create(name) project.open(factory, settings) return project except errors.ProjectExistsError: pass class ProjectManager2(ProjectManager): def upgrade(self, fpath): basename = fpath.basename().strip(" \t.") + "_" for c in itertools.count(): try: prj = self.get_project(basename + str(c)) prj.create() fpath.moveTo(prj._project) return prj except errors.ProjectExistsError: pass def get_project(self, name): try: prj = ProjectManager.get_project(self, name) except errors.InvalidNameError: fp = filepath.FilePath(name) if not fp.isfile(): raise prj = self.upgrade(fp) return prj def open(self, name, factory, settings=settings, oldformat=True): prj = self.get_project(name) return prj.open(factory, settings) manager = ProjectManager2() virtualbricks-1.0.2/virtualbricks/qemu.py000066400000000000000000004340661262207653100206240ustar00rootroot00000000000000import re from distutils.version import LooseVersion QEMU_1_0_BINARIES = ( ("qemu-system-arm", "arm"), ("qemu-system-cris", "cris"), ("qemu-system-i386", "i386"), ("qemu-system-m68k", "m68k"), ("qemu-system-microblaze", "microblaze"), ("qemu-system-mips", "mips"), ("qemu-system-mips64", "mips64"), ("qemu-system-mips64el", "mips64el"), ("qemu-system-mipsel", "mipsel"), ("qemu-system-ppc", "ppc"), ("qemu-system-ppc64", "ppc64"), ("qemu-system-ppcemb", "ppcemb"), ("qemu-system-sh4", "sh4"), ("qemu-system-sh4eb", "sh4eb"), ("qemu-system-sparc", "sparc"), ("qemu-system-sparc64", "sparc64"), ("qemu-system-x86_64", "x86_64"), ) QEMU_1_0_CPUS = ( ("qemu-system-arm", ( ("arm1026", "arm1026"), ("arm1136", "arm1136"), ("arm1136-r2", "arm1136-r2"), ("arm1176", "arm1176"), ("arm11mpcore", "arm11mpcore"), ("arm926", "arm926"), ("arm946", "arm946"), ("cortex-a15", "cortex-a15"), ("cortex-a8", "cortex-a8"), ("cortex-a8-r2", "cortex-a8-r2"), ("cortex-a9", "cortex-a9"), ("cortex-m3", "cortex-m3"), ("pxa250", "pxa250"), ("pxa255", "pxa255"), ("pxa260", "pxa260"), ("pxa261", "pxa261"), ("pxa262", "pxa262"), ("pxa270", "pxa270"), ("pxa270-a0", "pxa270-a0"), ("pxa270-a1", "pxa270-a1"), ("pxa270-b0", "pxa270-b0"), ("pxa270-b1", "pxa270-b1"), ("pxa270-c0", "pxa270-c0"), ("pxa270-c5", "pxa270-c5"), ("sa1100", "sa1100"), ("sa1110", "sa1110"), ("ti925t", "ti925t"), ("any", "any"), )), ("qemu-system-cris", ( ("crisv8", "crisv8"), ("crisv9", "crisv9"), ("crisv10", "crisv10"), ("crisv11", "crisv11"), ("crisv32", "crisv32"), )), ("qemu-system-i386", ( ("n270", "n270"), ("athlon", "athlon"), ("pentium3", "pentium3"), ("pentium2", "pentium2"), ("pentium", "pentium"), ("486", "486"), ("coreduo", "coreduo"), ("kvm32", "kvm32"), ("qemu32", "qemu32"), ("kvm64", "kvm64"), ("core2duo", "core2duo"), ("phenom", "phenom"), ("qemu64", "qemu64"), )), ("qemu-system-m68k", ( ("cfv4e", "cfv4e"), ("m5206", "m5206"), ("m5208", "m5208"), ("any", "any"), )), ("qemu-system-microblaze", ()), ("qemu-system-mips", ( ("4Kc", "4Kc"), ("4Km", "4Km"), ("4KEcR1", "4KEcR1"), ("4KEmR1", "4KEmR1"), ("4KEc", "4KEc"), ("4KEm", "4KEm"), ("24Kc", "24Kc"), ("24Kf", "24Kf"), ("34Kf", "34Kf"), )), ("qemu-system-mips64", ( ("4Kc", "4Kc"), ("4Km", "4Km"), ("4KEcR1", "4KEcR1"), ("4KEmR1", "4KEmR1"), ("4KEc", "4KEc"), ("4KEm", "4KEm"), ("24Kc", "24Kc"), ("24Kf", "24Kf"), ("34Kf", "34Kf"), ("R4000", "R4000"), ("VR5432", "VR5432"), ("5Kc", "5Kc"), ("5Kf", "5Kf"), ("20Kc", "20Kc"), ("MIPS64R2-generic", "MIPS64R2-generic"), ("Loongson-2E", "Loongson-2E"), ("Loongson-2F", "Loongson-2F"), )), ("qemu-system-mips64el", ( ("4Kc", "4Kc"), ("4Km", "4Km"), ("4KEcR1", "4KEcR1"), ("4KEmR1", "4KEmR1"), ("4KEc", "4KEc"), ("4KEm", "4KEm"), ("24Kc", "24Kc"), ("24Kf", "24Kf"), ("34Kf", "34Kf"), ("R4000", "R4000"), ("VR5432", "VR5432"), ("5Kc", "5Kc"), ("5Kf", "5Kf"), ("20Kc", "20Kc"), ("MIPS64R2-generic", "MIPS64R2-generic"), ("Loongson-2E", "Loongson-2E"), ("Loongson-2F", "Loongson-2F"), )), ("qemu-system-mipsel", ( ("4Kc", "4Kc"), ("4Km", "4Km"), ("4KEcR1", "4KEcR1"), ("4KEmR1", "4KEmR1"), ("4KEc", "4KEc"), ("4KEm", "4KEm"), ("24Kc", "24Kc"), ("24Kf", "24Kf"), ("34Kf", "34Kf"), )), ("qemu-system-ppc", ( ("401", "401"), ("401A1", "401A1"), ("401B2", "401B2"), ("401C2", "401C2"), ("401D2", "401D2"), ("401E2", "401E2"), ("401F2", "401F2"), ("401G2", "401G2"), ("IOP480", "IOP480"), ("Cobra", "Cobra"), ("403", "403"), ("403GA", "403GA"), ("403GB", "403GB"), ("403GC", "403GC"), ("403GCX", "403GCX"), ("405", "405"), ("405D2", "405D2"), ("405D4", "405D4"), ("405CR", "405CR"), ("405CRa", "405CRa"), ("405CRb", "405CRb"), ("405CRc", "405CRc"), ("405EP", "405EP"), ("405EZ", "405EZ"), ("405GP", "405GP"), ("405GPa", "405GPa"), ("405GPb", "405GPb"), ("405GPc", "405GPc"), ("405GPd", "405GPd"), ("405GPe", "405GPe"), ("405GPR", "405GPR"), ("405LP", "405LP"), ("Npe405H", "Npe405H"), ("Npe405H2", "Npe405H2"), ("Npe405L", "Npe405L"), ("Npe4GS3", "Npe4GS3"), ("STB03", "STB03"), ("STB04", "STB04"), ("STB25", "STB25"), ("x2vp4", "x2vp4"), ("x2vp7", "x2vp7"), ("x2vp20", "x2vp20"), ("x2vp50", "x2vp50"), ("440-Xilinx", "440-Xilinx"), ("440EP", "440EP"), ("440EPa", "440EPa"), ("440EPb", "440EPb"), ("440EPX", "440EPX"), ("MPC52xx", "MPC52xx"), ("MPC82xx", "MPC82xx"), ("PowerQUICC-II", "PowerQUICC-II"), ("G2", "G2"), ("G2H4", "G2H4"), ("G2GP", "G2GP"), ("G2LS", "G2LS"), ("G2HiP3", "G2HiP3"), ("G2HiP4", "G2HiP4"), ("MPC603", "MPC603"), ("G2le", "G2le"), ("G2leGP", "G2leGP"), ("G2leLS", "G2leLS"), ("G2leGP1", "G2leGP1"), ("G2leGP3", "G2leGP3"), ("MPC8240", "MPC8240"), ("MPC5200", "MPC5200"), ("MPC5200_v10", "MPC5200_v10"), ("MPC5200_v11", "MPC5200_v11"), ("MPC5200_v12", "MPC5200_v12"), ("MPC5200B", "MPC5200B"), ("MPC5200B_v20", "MPC5200B_v20"), ("MPC5200B_v21", "MPC5200B_v21"), ("MPC8241", "MPC8241"), ("MPC8245", "MPC8245"), ("MPC8247", "MPC8247"), ("MPC8248", "MPC8248"), ("MPC8250", "MPC8250"), ("MPC8250_HiP3", "MPC8250_HiP3"), ("MPC8250_HiP4", "MPC8250_HiP4"), ("MPC8255", "MPC8255"), ("MPC8255_HiP3", "MPC8255_HiP3"), ("MPC8255_HiP4", "MPC8255_HiP4"), ("MPC8260", "MPC8260"), ("MPC8260_HiP3", "MPC8260_HiP3"), ("MPC8260_HiP4", "MPC8260_HiP4"), ("MPC8264", "MPC8264"), ("MPC8264_HiP3", "MPC8264_HiP3"), ("MPC8264_HiP4", "MPC8264_HiP4"), ("MPC8265", "MPC8265"), ("MPC8265_HiP3", "MPC8265_HiP3"), ("MPC8265_HiP4", "MPC8265_HiP4"), ("MPC8266", "MPC8266"), ("MPC8266_HiP3", "MPC8266_HiP3"), ("MPC8266_HiP4", "MPC8266_HiP4"), ("MPC8270", "MPC8270"), ("MPC8271", "MPC8271"), ("MPC8272", "MPC8272"), ("MPC8275", "MPC8275"), ("MPC8280", "MPC8280"), ("e200", "e200"), ("e200z5", "e200z5"), ("e200z6", "e200z6"), ("e300", "e300"), ("e300c1", "e300c1"), ("e300c2", "e300c2"), ("e300c3", "e300c3"), ("e300c4", "e300c4"), ("MPC8343", "MPC8343"), ("MPC8343A", "MPC8343A"), ("MPC8343E", "MPC8343E"), ("MPC8343EA", "MPC8343EA"), ("MPC8347", "MPC8347"), ("MPC8347T", "MPC8347T"), ("MPC8347P", "MPC8347P"), ("MPC8347A", "MPC8347A"), ("MPC8347AT", "MPC8347AT"), ("MPC8347AP", "MPC8347AP"), ("MPC8347E", "MPC8347E"), ("MPC8347ET", "MPC8347ET"), ("MPC8347EP", "MPC8347EP"), ("MPC8347EA", "MPC8347EA"), ("MPC8347EAT", "MPC8347EAT"), ("MPC8347EAP", "MPC8347EAP"), ("MPC8349", "MPC8349"), ("MPC8349A", "MPC8349A"), ("MPC8349E", "MPC8349E"), ("MPC8349EA", "MPC8349EA"), ("MPC8377", "MPC8377"), ("MPC8377E", "MPC8377E"), ("MPC8378", "MPC8378"), ("MPC8378E", "MPC8378E"), ("MPC8379", "MPC8379"), ("MPC8379E", "MPC8379E"), ("e500", "e500"), ("e500v1", "e500v1"), ("e500_v10", "e500_v10"), ("e500_v20", "e500_v20"), ("e500v2", "e500v2"), ("e500v2_v10", "e500v2_v10"), ("e500v2_v20", "e500v2_v20"), ("e500v2_v21", "e500v2_v21"), ("e500v2_v22", "e500v2_v22"), ("e500v2_v30", "e500v2_v30"), ("e500mc", "e500mc"), ("MPC8533", "MPC8533"), ("MPC8533_v10", "MPC8533_v10"), ("MPC8533_v11", "MPC8533_v11"), ("MPC8533E", "MPC8533E"), ("MPC8533E_v10", "MPC8533E_v10"), ("MPC8533E_v11", "MPC8533E_v11"), ("MPC8540", "MPC8540"), ("MPC8540_v10", "MPC8540_v10"), ("MPC8540_v20", "MPC8540_v20"), ("MPC8540_v21", "MPC8540_v21"), ("MPC8541", "MPC8541"), ("MPC8541_v10", "MPC8541_v10"), ("MPC8541_v11", "MPC8541_v11"), ("MPC8541E", "MPC8541E"), ("MPC8541E_v10", "MPC8541E_v10"), ("MPC8541E_v11", "MPC8541E_v11"), ("MPC8543", "MPC8543"), ("MPC8543_v10", "MPC8543_v10"), ("MPC8543_v11", "MPC8543_v11"), ("MPC8543_v20", "MPC8543_v20"), ("MPC8543_v21", "MPC8543_v21"), ("MPC8543E", "MPC8543E"), ("MPC8543E_v10", "MPC8543E_v10"), ("MPC8543E_v11", "MPC8543E_v11"), ("MPC8543E_v20", "MPC8543E_v20"), ("MPC8543E_v21", "MPC8543E_v21"), ("MPC8544", "MPC8544"), ("MPC8544_v10", "MPC8544_v10"), ("MPC8544_v11", "MPC8544_v11"), ("MPC8544E", "MPC8544E"), ("MPC8544E_v10", "MPC8544E_v10"), ("MPC8544E_v11", "MPC8544E_v11"), ("MPC8545", "MPC8545"), ("MPC8545_v20", "MPC8545_v20"), ("MPC8545_v21", "MPC8545_v21"), ("MPC8545E", "MPC8545E"), ("MPC8545E_v20", "MPC8545E_v20"), ("MPC8545E_v21", "MPC8545E_v21"), ("MPC8547E", "MPC8547E"), ("MPC8547E_v20", "MPC8547E_v20"), ("MPC8547E_v21", "MPC8547E_v21"), ("MPC8548", "MPC8548"), ("MPC8548_v10", "MPC8548_v10"), ("MPC8548_v11", "MPC8548_v11"), ("MPC8548_v20", "MPC8548_v20"), ("MPC8548_v21", "MPC8548_v21"), ("MPC8548E", "MPC8548E"), ("MPC8548E_v10", "MPC8548E_v10"), ("MPC8548E_v11", "MPC8548E_v11"), ("MPC8548E_v20", "MPC8548E_v20"), ("MPC8548E_v21", "MPC8548E_v21"), ("MPC8555", "MPC8555"), ("MPC8555_v10", "MPC8555_v10"), ("MPC8555_v11", "MPC8555_v11"), ("MPC8555E", "MPC8555E"), ("MPC8555E_v10", "MPC8555E_v10"), ("MPC8555E_v11", "MPC8555E_v11"), ("MPC8560", "MPC8560"), ("MPC8560_v10", "MPC8560_v10"), ("MPC8560_v20", "MPC8560_v20"), ("MPC8560_v21", "MPC8560_v21"), ("MPC8567", "MPC8567"), ("MPC8567E", "MPC8567E"), ("MPC8568", "MPC8568"), ("MPC8568E", "MPC8568E"), ("MPC8572", "MPC8572"), ("MPC8572E", "MPC8572E"), ("e600", "e600"), ("MPC8641", "MPC8641"), ("MPC8641D", "MPC8641D"), ("601", "601"), ("601_v0", "601_v0"), ("601_v1", "601_v1"), ("601v", "601v"), ("601_v2", "601_v2"), ("602", "602"), ("603", "603"), ("Vanilla", "Vanilla"), ("603e", "603e"), ("Stretch", "Stretch"), ("603e_v1.1", "603e_v1.1"), ("603e_v1.2", "603e_v1.2"), ("603e_v1.3", "603e_v1.3"), ("603e_v1.4", "603e_v1.4"), ("603e_v2.2", "603e_v2.2"), ("603e_v3", "603e_v3"), ("603e_v4", "603e_v4"), ("603e_v4.1", "603e_v4.1"), ("603e7", "603e7"), ("603e7t", "603e7t"), ("603e7v", "603e7v"), ("Vaillant", "Vaillant"), ("603e7v1", "603e7v1"), ("603e7v2", "603e7v2"), ("603p", "603p"), ("603r", "603r"), ("Goldeneye", "Goldeneye"), ("604", "604"), ("604e", "604e"), ("Sirocco", "Sirocco"), ("604e_v1.0", "604e_v1.0"), ("604e_v2.2", "604e_v2.2"), ("604e_v2.4", "604e_v2.4"), ("604r", "604r"), ("Mach5", "Mach5"), ("740", "740"), ("Arthur", "Arthur"), ("750", "750"), ("Typhoon", "Typhoon"), ("G3", "G3"), ("740_v1.0", "740_v1.0"), ("750_v1.0", "750_v1.0"), ("740_v2.0", "740_v2.0"), ("750_v2.0", "750_v2.0"), ("740_v2.1", "740_v2.1"), ("750_v2.1", "750_v2.1"), ("740_v2.2", "740_v2.2"), ("750_v2.2", "750_v2.2"), ("740_v3.0", "740_v3.0"), ("750_v3.0", "750_v3.0"), ("740_v3.1", "740_v3.1"), ("750_v3.1", "750_v3.1"), ("740e", "740e"), ("750e", "750e"), ("740p", "740p"), ("750p", "750p"), ("Conan/Doyle", "Conan/Doyle"), ("750cl", "750cl"), ("750cl_v1.0", "750cl_v1.0"), ("750cl_v2.0", "750cl_v2.0"), ("750cx", "750cx"), ("750cx_v1.0", "750cx_v1.0"), ("750cx_v2.0", "750cx_v2.0"), ("750cx_v2.1", "750cx_v2.1"), ("750cx_v2.2", "750cx_v2.2"), ("750cxe", "750cxe"), ("750cxe_v2.1", "750cxe_v2.1"), ("750cxe_v2.2", "750cxe_v2.2"), ("750cxe_v2.3", "750cxe_v2.3"), ("750cxe_v2.4", "750cxe_v2.4"), ("750cxe_v2.4b", "750cxe_v2.4b"), ("750cxe_v3.0", "750cxe_v3.0"), ("750cxe_v3.1", "750cxe_v3.1"), ("750cxe_v3.1b", "750cxe_v3.1b"), ("750cxr", "750cxr"), ("750fl", "750fl"), ("750fx", "750fx"), ("750fx_v1.0", "750fx_v1.0"), ("750fx_v2.0", "750fx_v2.0"), ("750fx_v2.1", "750fx_v2.1"), ("750fx_v2.2", "750fx_v2.2"), ("750fx_v2.3", "750fx_v2.3"), ("750gl", "750gl"), ("750gx", "750gx"), ("750gx_v1.0", "750gx_v1.0"), ("750gx_v1.1", "750gx_v1.1"), ("750gx_v1.2", "750gx_v1.2"), ("750l", "750l"), ("LoneStar", "LoneStar"), ("750l_v2.0", "750l_v2.0"), ("750l_v2.1", "750l_v2.1"), ("750l_v2.2", "750l_v2.2"), ("750l_v3.0", "750l_v3.0"), ("750l_v3.2", "750l_v3.2"), ("745", "745"), ("755", "755"), ("Goldfinger", "Goldfinger"), ("745_v1.0", "745_v1.0"), ("755_v1.0", "755_v1.0"), ("745_v1.1", "745_v1.1"), ("755_v1.1", "755_v1.1"), ("745_v2.0", "745_v2.0"), ("755_v2.0", "755_v2.0"), ("745_v2.1", "745_v2.1"), ("755_v2.1", "755_v2.1"), ("745_v2.2", "745_v2.2"), ("755_v2.2", "755_v2.2"), ("745_v2.3", "745_v2.3"), ("755_v2.3", "755_v2.3"), ("745_v2.4", "745_v2.4"), ("755_v2.4", "755_v2.4"), ("745_v2.5", "745_v2.5"), ("755_v2.5", "755_v2.5"), ("745_v2.6", "745_v2.6"), ("755_v2.6", "755_v2.6"), ("745_v2.7", "745_v2.7"), ("755_v2.7", "755_v2.7"), ("745_v2.8", "745_v2.8"), ("755_v2.8", "755_v2.8"), ("7400", "7400"), ("Max", "Max"), ("G4", "G4"), ("7400_v1.0", "7400_v1.0"), ("7400_v1.1", "7400_v1.1"), ("7400_v2.0", "7400_v2.0"), ("7400_v2.1", "7400_v2.1"), ("7400_v2.2", "7400_v2.2"), ("7400_v2.6", "7400_v2.6"), ("7400_v2.7", "7400_v2.7"), ("7400_v2.8", "7400_v2.8"), ("7400_v2.9", "7400_v2.9"), ("7410", "7410"), ("Nitro", "Nitro"), ("7410_v1.0", "7410_v1.0"), ("7410_v1.1", "7410_v1.1"), ("7410_v1.2", "7410_v1.2"), ("7410_v1.3", "7410_v1.3"), ("7410_v1.4", "7410_v1.4"), ("7448", "7448"), ("7448_v1.0", "7448_v1.0"), ("7448_v1.1", "7448_v1.1"), ("7448_v2.0", "7448_v2.0"), ("7448_v2.1", "7448_v2.1"), ("7450", "7450"), ("Vger", "Vger"), ("7450_v1.0", "7450_v1.0"), ("7450_v1.1", "7450_v1.1"), ("7450_v1.2", "7450_v1.2"), ("7450_v2.0", "7450_v2.0"), ("7450_v2.1", "7450_v2.1"), ("7441", "7441"), ("7451", "7451"), ("7441_v2.1", "7441_v2.1"), ("7441_v2.3", "7441_v2.3"), ("7451_v2.3", "7451_v2.3"), ("7441_v2.10", "7441_v2.10"), ("7451_v2.10", "7451_v2.10"), ("7445", "7445"), ("7455", "7455"), ("Apollo6", "Apollo6"), ("7445_v1.0", "7445_v1.0"), ("7455_v1.0", "7455_v1.0"), ("7445_v2.1", "7445_v2.1"), ("7455_v2.1", "7455_v2.1"), ("7445_v3.2", "7445_v3.2"), ("7455_v3.2", "7455_v3.2"), ("7445_v3.3", "7445_v3.3"), ("7455_v3.3", "7455_v3.3"), ("7445_v3.4", "7445_v3.4"), ("7455_v3.4", "7455_v3.4"), ("7447", "7447"), ("7457", "7457"), ("Apollo7", "Apollo7"), ("7447_v1.0", "7447_v1.0"), ("7457_v1.0", "7457_v1.0"), ("7447_v1.1", "7447_v1.1"), ("7457_v1.1", "7457_v1.1"), ("7457_v1.2", "7457_v1.2"), ("7447A", "7447A"), ("7457A", "7457A"), ("7447A_v1.0", "7447A_v1.0"), ("7457A_v1.0", "7457A_v1.0"), ("Apollo7PM", "Apollo7PM"), ("7447A_v1.1", "7447A_v1.1"), ("7457A_v1.1", "7457A_v1.1"), ("7447A_v1.2", "7447A_v1.2"), ("7457A_v1.2", "7457A_v1.2"), ("ppc32", "ppc32"), ("ppc", "ppc"), ("default", "default"), )), ("qemu-system-ppc64", ( ("401", "401"), ("401A1", "401A1"), ("401B2", "401B2"), ("401C2", "401C2"), ("401D2", "401D2"), ("401E2", "401E2"), ("401F2", "401F2"), ("401G2", "401G2"), ("IOP480", "IOP480"), ("Cobra", "Cobra"), ("403", "403"), ("403GA", "403GA"), ("403GB", "403GB"), ("403GC", "403GC"), ("403GCX", "403GCX"), ("405", "405"), ("405D2", "405D2"), ("405D4", "405D4"), ("405CR", "405CR"), ("405CRa", "405CRa"), ("405CRb", "405CRb"), ("405CRc", "405CRc"), ("405EP", "405EP"), ("405EZ", "405EZ"), ("405GP", "405GP"), ("405GPa", "405GPa"), ("405GPb", "405GPb"), ("405GPc", "405GPc"), ("405GPd", "405GPd"), ("405GPe", "405GPe"), ("405GPR", "405GPR"), ("405LP", "405LP"), ("Npe405H", "Npe405H"), ("Npe405H2", "Npe405H2"), ("Npe405L", "Npe405L"), ("Npe4GS3", "Npe4GS3"), ("STB03", "STB03"), ("STB04", "STB04"), ("STB25", "STB25"), ("x2vp4", "x2vp4"), ("x2vp7", "x2vp7"), ("x2vp20", "x2vp20"), ("x2vp50", "x2vp50"), ("440-Xilinx", "440-Xilinx"), ("440EP", "440EP"), ("440EPa", "440EPa"), ("440EPb", "440EPb"), ("440EPX", "440EPX"), ("MPC52xx", "MPC52xx"), ("MPC82xx", "MPC82xx"), ("PowerQUICC-II", "PowerQUICC-II"), ("G2", "G2"), ("G2H4", "G2H4"), ("G2GP", "G2GP"), ("G2LS", "G2LS"), ("G2HiP3", "G2HiP3"), ("G2HiP4", "G2HiP4"), ("MPC603", "MPC603"), ("G2le", "G2le"), ("G2leGP", "G2leGP"), ("G2leLS", "G2leLS"), ("G2leGP1", "G2leGP1"), ("G2leGP3", "G2leGP3"), ("MPC8240", "MPC8240"), ("MPC5200", "MPC5200"), ("MPC5200_v10", "MPC5200_v10"), ("MPC5200_v11", "MPC5200_v11"), ("MPC5200_v12", "MPC5200_v12"), ("MPC5200B", "MPC5200B"), ("MPC5200B_v20", "MPC5200B_v20"), ("MPC5200B_v21", "MPC5200B_v21"), ("MPC8241", "MPC8241"), ("MPC8245", "MPC8245"), ("MPC8247", "MPC8247"), ("MPC8248", "MPC8248"), ("MPC8250", "MPC8250"), ("MPC8250_HiP3", "MPC8250_HiP3"), ("MPC8250_HiP4", "MPC8250_HiP4"), ("MPC8255", "MPC8255"), ("MPC8255_HiP3", "MPC8255_HiP3"), ("MPC8255_HiP4", "MPC8255_HiP4"), ("MPC8260", "MPC8260"), ("MPC8260_HiP3", "MPC8260_HiP3"), ("MPC8260_HiP4", "MPC8260_HiP4"), ("MPC8264", "MPC8264"), ("MPC8264_HiP3", "MPC8264_HiP3"), ("MPC8264_HiP4", "MPC8264_HiP4"), ("MPC8265", "MPC8265"), ("MPC8265_HiP3", "MPC8265_HiP3"), ("MPC8265_HiP4", "MPC8265_HiP4"), ("MPC8266", "MPC8266"), ("MPC8266_HiP3", "MPC8266_HiP3"), ("MPC8266_HiP4", "MPC8266_HiP4"), ("MPC8270", "MPC8270"), ("MPC8271", "MPC8271"), ("MPC8272", "MPC8272"), ("MPC8275", "MPC8275"), ("MPC8280", "MPC8280"), ("e200", "e200"), ("e200z5", "e200z5"), ("e200z6", "e200z6"), ("e300", "e300"), ("e300c1", "e300c1"), ("e300c2", "e300c2"), ("e300c3", "e300c3"), ("e300c4", "e300c4"), ("MPC8343", "MPC8343"), ("MPC8343A", "MPC8343A"), ("MPC8343E", "MPC8343E"), ("MPC8343EA", "MPC8343EA"), ("MPC8347", "MPC8347"), ("MPC8347T", "MPC8347T"), ("MPC8347P", "MPC8347P"), ("MPC8347A", "MPC8347A"), ("MPC8347AT", "MPC8347AT"), ("MPC8347AP", "MPC8347AP"), ("MPC8347E", "MPC8347E"), ("MPC8347ET", "MPC8347ET"), ("MPC8347EP", "MPC8347EP"), ("MPC8347EA", "MPC8347EA"), ("MPC8347EAT", "MPC8347EAT"), ("MPC8347EAP", "MPC8347EAP"), ("MPC8349", "MPC8349"), ("MPC8349A", "MPC8349A"), ("MPC8349E", "MPC8349E"), ("MPC8349EA", "MPC8349EA"), ("MPC8377", "MPC8377"), ("MPC8377E", "MPC8377E"), ("MPC8378", "MPC8378"), ("MPC8378E", "MPC8378E"), ("MPC8379", "MPC8379"), ("MPC8379E", "MPC8379E"), ("e500", "e500"), ("e500v1", "e500v1"), ("e500_v10", "e500_v10"), ("e500_v20", "e500_v20"), ("e500v2", "e500v2"), ("e500v2_v10", "e500v2_v10"), ("e500v2_v20", "e500v2_v20"), ("e500v2_v21", "e500v2_v21"), ("e500v2_v22", "e500v2_v22"), ("e500v2_v30", "e500v2_v30"), ("e500mc", "e500mc"), ("MPC8533", "MPC8533"), ("MPC8533_v10", "MPC8533_v10"), ("MPC8533_v11", "MPC8533_v11"), ("MPC8533E", "MPC8533E"), ("MPC8533E_v10", "MPC8533E_v10"), ("MPC8533E_v11", "MPC8533E_v11"), ("MPC8540", "MPC8540"), ("MPC8540_v10", "MPC8540_v10"), ("MPC8540_v20", "MPC8540_v20"), ("MPC8540_v21", "MPC8540_v21"), ("MPC8541", "MPC8541"), ("MPC8541_v10", "MPC8541_v10"), ("MPC8541_v11", "MPC8541_v11"), ("MPC8541E", "MPC8541E"), ("MPC8541E_v10", "MPC8541E_v10"), ("MPC8541E_v11", "MPC8541E_v11"), ("MPC8543", "MPC8543"), ("MPC8543_v10", "MPC8543_v10"), ("MPC8543_v11", "MPC8543_v11"), ("MPC8543_v20", "MPC8543_v20"), ("MPC8543_v21", "MPC8543_v21"), ("MPC8543E", "MPC8543E"), ("MPC8543E_v10", "MPC8543E_v10"), ("MPC8543E_v11", "MPC8543E_v11"), ("MPC8543E_v20", "MPC8543E_v20"), ("MPC8543E_v21", "MPC8543E_v21"), ("MPC8544", "MPC8544"), ("MPC8544_v10", "MPC8544_v10"), ("MPC8544_v11", "MPC8544_v11"), ("MPC8544E", "MPC8544E"), ("MPC8544E_v10", "MPC8544E_v10"), ("MPC8544E_v11", "MPC8544E_v11"), ("MPC8545", "MPC8545"), ("MPC8545_v20", "MPC8545_v20"), ("MPC8545_v21", "MPC8545_v21"), ("MPC8545E", "MPC8545E"), ("MPC8545E_v20", "MPC8545E_v20"), ("MPC8545E_v21", "MPC8545E_v21"), ("MPC8547E", "MPC8547E"), ("MPC8547E_v20", "MPC8547E_v20"), ("MPC8547E_v21", "MPC8547E_v21"), ("MPC8548", "MPC8548"), ("MPC8548_v10", "MPC8548_v10"), ("MPC8548_v11", "MPC8548_v11"), ("MPC8548_v20", "MPC8548_v20"), ("MPC8548_v21", "MPC8548_v21"), ("MPC8548E", "MPC8548E"), ("MPC8548E_v10", "MPC8548E_v10"), ("MPC8548E_v11", "MPC8548E_v11"), ("MPC8548E_v20", "MPC8548E_v20"), ("MPC8548E_v21", "MPC8548E_v21"), ("MPC8555", "MPC8555"), ("MPC8555_v10", "MPC8555_v10"), ("MPC8555_v11", "MPC8555_v11"), ("MPC8555E", "MPC8555E"), ("MPC8555E_v10", "MPC8555E_v10"), ("MPC8555E_v11", "MPC8555E_v11"), ("MPC8560", "MPC8560"), ("MPC8560_v10", "MPC8560_v10"), ("MPC8560_v20", "MPC8560_v20"), ("MPC8560_v21", "MPC8560_v21"), ("MPC8567", "MPC8567"), ("MPC8567E", "MPC8567E"), ("MPC8568", "MPC8568"), ("MPC8568E", "MPC8568E"), ("MPC8572", "MPC8572"), ("MPC8572E", "MPC8572E"), ("e600", "e600"), ("MPC8641", "MPC8641"), ("MPC8641D", "MPC8641D"), ("601", "601"), ("601_v0", "601_v0"), ("601_v1", "601_v1"), ("601v", "601v"), ("601_v2", "601_v2"), ("602", "602"), ("603", "603"), ("Vanilla", "Vanilla"), ("603e", "603e"), ("Stretch", "Stretch"), ("603e_v1.1", "603e_v1.1"), ("603e_v1.2", "603e_v1.2"), ("603e_v1.3", "603e_v1.3"), ("603e_v1.4", "603e_v1.4"), ("603e_v2.2", "603e_v2.2"), ("603e_v3", "603e_v3"), ("603e_v4", "603e_v4"), ("603e_v4.1", "603e_v4.1"), ("603e7", "603e7"), ("603e7t", "603e7t"), ("603e7v", "603e7v"), ("Vaillant", "Vaillant"), ("603e7v1", "603e7v1"), ("603e7v2", "603e7v2"), ("603p", "603p"), ("603r", "603r"), ("Goldeneye", "Goldeneye"), ("604", "604"), ("604e", "604e"), ("Sirocco", "Sirocco"), ("604e_v1.0", "604e_v1.0"), ("604e_v2.2", "604e_v2.2"), ("604e_v2.4", "604e_v2.4"), ("604r", "604r"), ("Mach5", "Mach5"), ("740", "740"), ("Arthur", "Arthur"), ("750", "750"), ("Typhoon", "Typhoon"), ("G3", "G3"), ("740_v1.0", "740_v1.0"), ("750_v1.0", "750_v1.0"), ("740_v2.0", "740_v2.0"), ("750_v2.0", "750_v2.0"), ("740_v2.1", "740_v2.1"), ("750_v2.1", "750_v2.1"), ("740_v2.2", "740_v2.2"), ("750_v2.2", "750_v2.2"), ("740_v3.0", "740_v3.0"), ("750_v3.0", "750_v3.0"), ("740_v3.1", "740_v3.1"), ("750_v3.1", "750_v3.1"), ("740e", "740e"), ("750e", "750e"), ("740p", "740p"), ("750p", "750p"), ("Conan/Doyle", "Conan/Doyle"), ("750cl", "750cl"), ("750cl_v1.0", "750cl_v1.0"), ("750cl_v2.0", "750cl_v2.0"), ("750cx", "750cx"), ("750cx_v1.0", "750cx_v1.0"), ("750cx_v2.0", "750cx_v2.0"), ("750cx_v2.1", "750cx_v2.1"), ("750cx_v2.2", "750cx_v2.2"), ("750cxe", "750cxe"), ("750cxe_v2.1", "750cxe_v2.1"), ("750cxe_v2.2", "750cxe_v2.2"), ("750cxe_v2.3", "750cxe_v2.3"), ("750cxe_v2.4", "750cxe_v2.4"), ("750cxe_v2.4b", "750cxe_v2.4b"), ("750cxe_v3.0", "750cxe_v3.0"), ("750cxe_v3.1", "750cxe_v3.1"), ("750cxe_v3.1b", "750cxe_v3.1b"), ("750cxr", "750cxr"), ("750fl", "750fl"), ("750fx", "750fx"), ("750fx_v1.0", "750fx_v1.0"), ("750fx_v2.0", "750fx_v2.0"), ("750fx_v2.1", "750fx_v2.1"), ("750fx_v2.2", "750fx_v2.2"), ("750fx_v2.3", "750fx_v2.3"), ("750gl", "750gl"), ("750gx", "750gx"), ("750gx_v1.0", "750gx_v1.0"), ("750gx_v1.1", "750gx_v1.1"), ("750gx_v1.2", "750gx_v1.2"), ("750l", "750l"), ("LoneStar", "LoneStar"), ("750l_v2.0", "750l_v2.0"), ("750l_v2.1", "750l_v2.1"), ("750l_v2.2", "750l_v2.2"), ("750l_v3.0", "750l_v3.0"), ("750l_v3.2", "750l_v3.2"), ("745", "745"), ("755", "755"), ("Goldfinger", "Goldfinger"), ("745_v1.0", "745_v1.0"), ("755_v1.0", "755_v1.0"), ("745_v1.1", "745_v1.1"), ("755_v1.1", "755_v1.1"), ("745_v2.0", "745_v2.0"), ("755_v2.0", "755_v2.0"), ("745_v2.1", "745_v2.1"), ("755_v2.1", "755_v2.1"), ("745_v2.2", "745_v2.2"), ("755_v2.2", "755_v2.2"), ("745_v2.3", "745_v2.3"), ("755_v2.3", "755_v2.3"), ("745_v2.4", "745_v2.4"), ("755_v2.4", "755_v2.4"), ("745_v2.5", "745_v2.5"), ("755_v2.5", "755_v2.5"), ("745_v2.6", "745_v2.6"), ("755_v2.6", "755_v2.6"), ("745_v2.7", "745_v2.7"), ("755_v2.7", "755_v2.7"), ("745_v2.8", "745_v2.8"), ("755_v2.8", "755_v2.8"), ("7400", "7400"), ("Max", "Max"), ("G4", "G4"), ("7400_v1.0", "7400_v1.0"), ("7400_v1.1", "7400_v1.1"), ("7400_v2.0", "7400_v2.0"), ("7400_v2.1", "7400_v2.1"), ("7400_v2.2", "7400_v2.2"), ("7400_v2.6", "7400_v2.6"), ("7400_v2.7", "7400_v2.7"), ("7400_v2.8", "7400_v2.8"), ("7400_v2.9", "7400_v2.9"), ("7410", "7410"), ("Nitro", "Nitro"), ("7410_v1.0", "7410_v1.0"), ("7410_v1.1", "7410_v1.1"), ("7410_v1.2", "7410_v1.2"), ("7410_v1.3", "7410_v1.3"), ("7410_v1.4", "7410_v1.4"), ("7448", "7448"), ("7448_v1.0", "7448_v1.0"), ("7448_v1.1", "7448_v1.1"), ("7448_v2.0", "7448_v2.0"), ("7448_v2.1", "7448_v2.1"), ("7450", "7450"), ("Vger", "Vger"), ("7450_v1.0", "7450_v1.0"), ("7450_v1.1", "7450_v1.1"), ("7450_v1.2", "7450_v1.2"), ("7450_v2.0", "7450_v2.0"), ("7450_v2.1", "7450_v2.1"), ("7441", "7441"), ("7451", "7451"), ("7441_v2.1", "7441_v2.1"), ("7441_v2.3", "7441_v2.3"), ("7451_v2.3", "7451_v2.3"), ("7441_v2.10", "7441_v2.10"), ("7451_v2.10", "7451_v2.10"), ("7445", "7445"), ("7455", "7455"), ("Apollo6", "Apollo6"), ("7445_v1.0", "7445_v1.0"), ("7455_v1.0", "7455_v1.0"), ("7445_v2.1", "7445_v2.1"), ("7455_v2.1", "7455_v2.1"), ("7445_v3.2", "7445_v3.2"), ("7455_v3.2", "7455_v3.2"), ("7445_v3.3", "7445_v3.3"), ("7455_v3.3", "7455_v3.3"), ("7445_v3.4", "7445_v3.4"), ("7455_v3.4", "7455_v3.4"), ("7447", "7447"), ("7457", "7457"), ("Apollo7", "Apollo7"), ("7447_v1.0", "7447_v1.0"), ("7457_v1.0", "7457_v1.0"), ("7447_v1.1", "7447_v1.1"), ("7457_v1.1", "7457_v1.1"), ("7457_v1.2", "7457_v1.2"), ("7447A", "7447A"), ("7457A", "7457A"), ("7447A_v1.0", "7447A_v1.0"), ("7457A_v1.0", "7457A_v1.0"), ("Apollo7PM", "Apollo7PM"), ("7447A_v1.1", "7447A_v1.1"), ("7457A_v1.1", "7457A_v1.1"), ("7447A_v1.2", "7447A_v1.2"), ("7457A_v1.2", "7457A_v1.2"), ("620", "620"), ("Trident", "Trident"), ("POWER7", "POWER7"), ("POWER7_v2.0", "POWER7_v2.0"), ("POWER7_v2.1", "POWER7_v2.1"), ("POWER7_v2.3", "POWER7_v2.3"), ("970", "970"), ("970fx", "970fx"), ("970fx_v1.0", "970fx_v1.0"), ("970fx_v2.0", "970fx_v2.0"), ("970fx_v2.1", "970fx_v2.1"), ("970fx_v3.0", "970fx_v3.0"), ("970fx_v3.1", "970fx_v3.1"), ("970gx", "970gx"), ("970mp", "970mp"), ("970mp_v1.0", "970mp_v1.0"), ("970mp_v1.1", "970mp_v1.1"), ("ppc64", "ppc64"), ("ppc32", "ppc32"), ("ppc", "ppc"), ("default", "default"), )), ("qemu-system-ppcemb", ( ("440-Xilinx", "440-Xilinx"), ("440EP", "440EP"), ("440EPa", "440EPa"), ("440EPb", "440EPb"), ("440EPX", "440EPX"), )), ("qemu-system-sh4", ( ("SH7750R", "SH7750R"), ("SH7751R", "SH7751R"), ("SH7785", "SH7785"), )), ("qemu-system-sh4eb", ( ("SH7750R", "SH7750R"), ("SH7751R", "SH7751R"), ("SH7785", "SH7785"), )), ("qemu-system-sparc", ( # Sparc Fujitsu MB86900 IU 00000000 FPU 00080000 MMU 00000000 NWINS 7 -swap -mul -div -flush -fsqrt -fmul # Sparc Fujitsu MB86904 IU 04000000 FPU 00080000 MMU 04000000 NWINS 8 # Sparc Fujitsu MB86907 IU 05000000 FPU 00080000 MMU 05000000 NWINS 8 # Sparc LSI L64811 IU 10000000 FPU 00020000 MMU 10000000 NWINS 8 -mul -div -flush -fmul # Sparc Cypress CY7C601 IU 11000000 FPU 00060000 MMU 10000000 NWINS 8 -mul -div -flush -fmul # Sparc Cypress CY7C611 IU 13000000 FPU 00060000 MMU 10000000 NWINS 8 -mul -div -flush -fmul # Sparc TI MicroSparc I IU 41000000 FPU 00080000 MMU 41000000 NWINS 7 -fsmuld # Sparc TI MicroSparc II IU 42000000 FPU 00080000 MMU 02000000 NWINS 8 # Sparc TI MicroSparc IIep IU 42000000 FPU 00080000 MMU 04000000 NWINS 8 # Sparc TI SuperSparc 40 IU 41000000 FPU 00000000 MMU 00000800 NWINS 8 # Sparc TI SuperSparc 50 IU 40000000 FPU 00000000 MMU 01000800 NWINS 8 # Sparc TI SuperSparc 51 IU 40000000 FPU 00000000 MMU 01000000 NWINS 8 # Sparc TI SuperSparc 60 IU 40000000 FPU 00000000 MMU 01000800 NWINS 8 # Sparc TI SuperSparc 61 IU 44000000 FPU 00000000 MMU 01000000 NWINS 8 # Sparc TI SuperSparc II IU 40000000 FPU 00000000 MMU 08000000 NWINS 8 # Sparc Ross RT625 IU 1e000000 FPU 00020000 MMU 1e000000 NWINS 8 # Sparc Ross RT620 IU 1f000000 FPU 00020000 MMU 1f000000 NWINS 8 # Sparc BIT B5010 IU 20000000 FPU 00000000 MMU 20000000 NWINS 8 -mul -div -flush -fmul # Sparc Matsushita MN10501 IU 50000000 FPU 00000000 MMU 50000000 NWINS 8 -swap -div -flush -fmul # Sparc Weitek W8601 IU 90000000 FPU 00060000 MMU 10000000 NWINS 8 # Sparc LEON2 IU f2000000 FPU 00080000 MMU f2000000 NWINS 8 # Sparc LEON3 IU f3000000 FPU 00080000 MMU f3000000 NWINS 8 # Default CPU feature flags (use '-' to remove): float swap mul div flush fsqrt fmul fsmuld # Available CPU feature flags (use '+' to add): float128 vis1 vis2 hypv cmt gl # Numerical features (use '=' to set): iu_version fpu_version mmu_version nwindows )), ("qemu-system-sparc64", ( # Sparc Fujitsu Sparc64 IU 0004000200000000 FPU 00000000 MMU 00000000 NWINS 4 # Sparc Fujitsu Sparc64 III IU 0004000300000000 FPU 00000000 MMU 00000000 NWINS 5 # Sparc Fujitsu Sparc64 IV IU 0004000400000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc Fujitsu Sparc64 V IU 0004000551000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc TI UltraSparc I IU 0017001040000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc TI UltraSparc II IU 0017001120000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc TI UltraSparc IIi IU 0017001291000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc TI UltraSparc IIe IU 0017001314000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc Sun UltraSparc III IU 003e001434000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc Sun UltraSparc III Cu IU 003e001541000000 FPU 00000000 MMU 00000001 NWINS 8 # Sparc Sun UltraSparc IIIi IU 003e001634000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc Sun UltraSparc IV IU 003e001831000000 FPU 00000000 MMU 00000002 NWINS 8 # Sparc Sun UltraSparc IV+ IU 003e001922000000 FPU 00000000 MMU 00000000 NWINS 8 +cmt # Sparc Sun UltraSparc IIIi+ IU 003e002200000000 FPU 00000000 MMU 00000001 NWINS 8 # Sparc Sun UltraSparc T1 IU 003e002302000000 FPU 00000000 MMU 00000003 NWINS 8 +hypv +cmt +gl # Sparc Sun UltraSparc T2 IU 003e002402000000 FPU 00000000 MMU 00000003 NWINS 8 +hypv +cmt +gl # Sparc NEC UltraSparc I IU 0022001040000000 FPU 00000000 MMU 00000000 NWINS 8 # Default CPU feature flags (use '-' to remove): float swap mul div flush fsqrt fmul vis1 vis2 fsmuld # Available CPU feature flags (use '+' to add): float128 hypv cmt gl # Numerical features (use '=' to set): iu_version fpu_version mmu_version nwindows )), ("qemu-system-x86_64", ( ("Opteron_G3", "Opteron_G3"), ("Opteron_G2", "Opteron_G2"), ("Opteron_G1", "Opteron_G1"), ("Nehalem", "Nehalem"), ("Penryn", "Penryn"), ("Conroe", "Conroe"), ("n270", "n270"), ("athlon", "athlon"), ("pentium3", "pentium3"), ("pentium2", "pentium2"), ("pentium", "pentium"), ("486", "486"), ("coreduo", "coreduo"), ("kvm32", "kvm32"), ("qemu32", "qemu32"), ("kvm64", "kvm64"), ("core2duo", "core2duo"), ("phenom", "phenom"), ("qemu64", "qemu64"), )), ) QEMU_1_0_MACHINES = ( ("qemu-system-arm", ( ("beagle", "Beagle board (OMAP3530)"), ("beaglexm", "Beagle board XM (OMAP3630)"), ("collie", "Collie PDA (SA-1110)"), ("nuri", "Samsung NURI board (Exynos4210)"), ("smdkc210", "Samsung SMDKC210 board (Exynos4210)"), ("connex", "Gumstix Connex (PXA255)"), ("verdex", "Gumstix Verdex (PXA270)"), ("highbank", "Calxeda Highbank (ECX-1000)"), ("integratorcp", "ARM Integrator/CP (ARM926EJ-S) (default)"), ("mainstone", "Mainstone II (PXA27x)"), ("musicpal", "Marvell 88w8618 / MusicPal (ARM926EJ-S)"), ("n800", "Nokia N800 tablet aka. RX-34 (OMAP2420)"), ("n810", "Nokia N810 tablet aka. RX-44 (OMAP2420)"), ("n900", "Nokia N900 (OMAP3)"), ("sx1", "Siemens SX1 (OMAP310) V2"), ("sx1-v1", "Siemens SX1 (OMAP310) V1"), ("overo", "Gumstix Overo board (OMAP3530)"), ("cheetah", "Palm Tungsten|E aka. Cheetah PDA (OMAP310)"), ("realview-eb", "ARM RealView Emulation Baseboard (ARM926EJ-S)"), ("realview-eb-mpcore", "ARM RealView Emulation Baseboard (ARM11MPCore)"), ("realview-pb-a8", "ARM RealView Platform Baseboard for Cortex-A8"), ("realview-pbx-a9", "ARM RealView Platform Baseboard Explore for Cortex-A9"), ("akita", "Akita PDA (PXA270)"), ("spitz", "Spitz PDA (PXA270)"), ("borzoi", "Borzoi PDA (PXA270)"), ("terrier", "Terrier PDA (PXA270)"), ("lm3s811evb", "Stellaris LM3S811EVB"), ("lm3s6965evb", "Stellaris LM3S6965EVB"), ("tosa", "Tosa PDA (PXA255)"), ("versatilepb", "ARM Versatile/PB (ARM926EJ-S)"), ("versatileab", "ARM Versatile/AB (ARM926EJ-S)"), ("vexpress-a9", "ARM Versatile Express for Cortex-A9"), ("vexpress-a15", "ARM Versatile Express for Cortex-A15"), ("z2", "Zipit Z2 (PXA27x)"), )), ("qemu-system-cris", ( ("axis-dev88", "AXIS devboard 88 (default)"), )), ("qemu-system-i386", ( ("pc", "Standard PC (alias of pc-1.0)"), ("pc-1.0", "Standard PC, pc-1.0 (default)"), ("pc-0.14", "Standard PC, pc-0.14"), ("pc-0.13", "Standard PC, pc-0.13"), ("pc-0.12", "Standard PC, pc-0.12"), ("pc-0.11", "Standard PC, qemu 0.11"), ("pc-0.10", "Standard PC, qemu 0.10"), ("isapc", "ISA-only PC"), )), ("qemu-system-m68k", ( ("an5206", "Arnewsh 5206"), ("dummy", "Dummy board"), ("mcf5208evb", "MCF5206EVB (default)"), )), ("qemu-system-microblaze", ( ("petalogix-ml605", "PetaLogix linux refdesign for xilinx ml605 little endian"), ("petalogix-s3adsp1800", "PetaLogix linux refdesign for xilinx Spartan 3ADSP1800 (default)"), )), ("qemu-system-mips", ( ("magnum", "MIPS Magnum"), ("pica61", "Acer Pica 61"), ("malta", "MIPS Malta Core LV (default)"), ("mipssim", "MIPS MIPSsim platform"), ("mips", "mips r4k platform"), )), ("qemu-system-mips64", ( ("magnum", "MIPS Magnum"), ("pica61", "Acer Pica 61"), ("malta", "MIPS Malta Core LV (default)"), ("mipssim", "MIPS MIPSsim platform"), ("mips", "mips r4k platform"), )), ("qemu-system-mips64el", ( ("fulong2e", "Fulong 2e mini pc"), ("magnum", "MIPS Magnum"), ("pica61", "Acer Pica 61"), ("malta", "MIPS Malta Core LV (default)"), ("mipssim", "MIPS MIPSsim platform"), ("mips", "mips r4k platform"), )), ("qemu-system-mipsel", ( ("magnum", "MIPS Magnum"), ("pica61", "Acer Pica 61"), ("malta", "MIPS Malta Core LV (default)"), ("mipssim", "MIPS MIPSsim platform"), ("mips", "mips r4k platform"), )), ("qemu-system-ppc", ( ("ref405ep", "ref405ep"), ("taihu", "taihu"), ("bamboo", "bamboo"), ("mac99", "Mac99 based PowerMAC"), ("g3beige", "Heathrow based PowerMAC (default)"), ("prep", "PowerPC PREP platform"), ("mpc8544ds", "mpc8544ds"), ("virtex-ml507", "Xilinx Virtex ML507 reference design"), )), ("qemu-system-ppc64", ( ("ref405ep", "ref405ep"), ("taihu", "taihu"), ("bamboo", "bamboo"), ("mac99", "Mac99 based PowerMAC (default)"), ("g3beige", "Heathrow based PowerMAC"), ("prep", "PowerPC PREP platform"), ("mpc8544ds", "mpc8544ds"), ("pseries", "pSeries Logical Partition (PAPR compliant)"), ("virtex-ml507", "Xilinx Virtex ML507 reference design"), )), ("qemu-system-ppcemb", ( ("ref405ep", "ref405ep"), ("taihu", "taihu"), ("bamboo", "bamboo"), ("mac99", "Mac99 based PowerMAC"), ("g3beige", "Heathrow based PowerMAC (default)"), ("prep", "PowerPC PREP platform"), ("mpc8544ds", "mpc8544ds"), ("virtex-ml507", "Xilinx Virtex ML507 reference design"), )), ("qemu-system-sh4", ( ("r2d", "r2d-plus board"), ("shix", "shix card (default)"), )), ("qemu-system-sh4eb", ( ("r2d", "r2d-plus board"), ("shix", "shix card (default)"), )), ("qemu-system-sparc", ( ("leon3_generic", "Leon-3 generic"), ("SS-5", "Sun4m platform, SPARCstation 5 (default)"), ("SS-10", "Sun4m platform, SPARCstation 10"), ("SS-600MP", "Sun4m platform, SPARCserver 600MP"), ("SS-20", "Sun4m platform, SPARCstation 20"), ("Voyager", "Sun4m platform, SPARCstation Voyager"), ("LX", "Sun4m platform, SPARCstation LX"), ("SS-4", "Sun4m platform, SPARCstation 4"), ("SPARCClassic", "Sun4m platform, SPARCClassic"), ("SPARCbook", "Sun4m platform, SPARCbook"), ("SS-1000", "Sun4d platform, SPARCserver 1000"), ("SS-2000", "Sun4d platform, SPARCcenter 2000"), ("SS-2", "Sun4c platform, SPARCstation 2"), )), ("qemu-system-sparc64", ( ("sun4u", "Sun4u platform (default)"), ("sun4v", "Sun4v platform"), ("Niagara", "Sun4v platform, Niagara"), )), ("qemu-system-x86_64", ( ("pc", "Standard PC (alias of pc-1.0)"), ("pc-1.0", "Standard PC, pc-1.0 (default)"), ("pc-0.14", "Standard PC, pc-0.14"), ("pc-0.13", "Standard PC, pc-0.13"), ("pc-0.12", "Standard PC, pc-0.12"), ("pc-0.11", "Standard PC, qemu 0.11"), ("pc-0.10", "Standard PC, qemu 0.10"), ("isapc", "ISA-only PC"), )), ) QEMU_1_1_2_BINARIES = ( ("qemu-system-alpha", "alpha"), ("qemu-system-arm", "arm"), ("qemu-system-cris", "cris"), ("qemu-system-i386", "i386"), ("qemu-system-lm32", "lm32"), ("qemu-system-m68k", "m68k"), ("qemu-system-microblaze", "microblaze"), ("qemu-system-microblazeel", "microblazeel"), ("qemu-system-mips", "mips"), ("qemu-system-mips64", "mips64"), ("qemu-system-mips64el", "mips64el"), ("qemu-system-mipsel", "mipsel"), ("qemu-system-ppc", "ppc"), ("qemu-system-ppc64", "ppc64"), ("qemu-system-ppcemb", "ppcemb"), ("qemu-system-s390x", "s390x"), ("qemu-system-sh4", "sh4"), ("qemu-system-sh4eb", "sh4eb"), ("qemu-system-sparc", "sparc"), ("qemu-system-sparc64", "sparc64"), ("qemu-system-x86_64", "x86_64"), ("qemu-system-xtensa", "xtensa"), ("qemu-system-xtensaeb", "xtensaeb") ) QEMU_1_1_2_CPUS = ( ("qemu-system-alpha", ()), ("qemu-system-arm", ( ("arm1026", "arm1026"), ("arm1136", "arm1136"), ("arm1136-r2", "arm1136-r2"), ("arm1176", "arm1176"), ("arm11mpcore", "arm11mpcore"), ("arm926", "arm926"), ("arm946", "arm946"), ("cortex-a15", "cortex-a15"), ("cortex-a8", "cortex-a8"), ("cortex-a9", "cortex-a9"), ("cortex-m3", "cortex-m3"), ("pxa250", "pxa250"), ("pxa255", "pxa255"), ("pxa260", "pxa260"), ("pxa261", "pxa261"), ("pxa262", "pxa262"), ("pxa270", "pxa270"), ("pxa270-a0", "pxa270-a0"), ("pxa270-a1", "pxa270-a1"), ("pxa270-b0", "pxa270-b0"), ("pxa270-b1", "pxa270-b1"), ("pxa270-c0", "pxa270-c0"), ("pxa270-c5", "pxa270-c5"), ("sa1100", "sa1100"), ("sa1110", "sa1110"), ("ti925t", "ti925t"), ("any", "any"), )), ("qemu-system-cris", ( ("crisv8", "crisv8"), ("crisv9", "crisv9"), ("crisv10", "crisv10"), ("crisv11", "crisv11"), ("crisv32", "crisv32"), )), ("qemu-system-i386", ( ("n270", "n270"), ("athlon", "athlon"), ("pentium3", "pentium3"), ("pentium2", "pentium2"), ("pentium", "pentium"), ("486", "486"), ("coreduo", "coreduo"), ("kvm32", "kvm32"), ("qemu32", "qemu32"), ("kvm64", "kvm64"), ("core2duo", "core2duo"), ("phenom", "phenom"), ("qemu64", "qemu64"), )), ("qemu-system-lm32", ( ("lm32-basic", "lm32-basic"), ("lm32-standard", "lm32-standard"), ("lm32-full", "lm32-full"), )), ("qemu-system-m68k", ( ("cfv4e", "cfv4e"), ("m5206", "m5206"), ("m5208", "m5208"), ("any", "any"), )), ("qemu-system-microblaze", ()), ("qemu-system-microblazeel", ()), ("qemu-system-mips", ( ("4Kc", "4Kc"), ("4Km", "4Km"), ("4KEcR1", "4KEcR1"), ("4KEmR1", "4KEmR1"), ("4KEc", "4KEc"), ("4KEm", "4KEm"), ("24Kc", "24Kc"), ("24Kf", "24Kf"), ("34Kf", "34Kf"), )), ("qemu-system-mips64", ( ("4Kc", "4Kc"), ("4Km", "4Km"), ("4KEcR1", "4KEcR1"), ("4KEmR1", "4KEmR1"), ("4KEc", "4KEc"), ("4KEm", "4KEm"), ("24Kc", "24Kc"), ("24Kf", "24Kf"), ("34Kf", "34Kf"), ("R4000", "R4000"), ("VR5432", "VR5432"), ("5Kc", "5Kc"), ("5Kf", "5Kf"), ("20Kc", "20Kc"), ("MIPS64R2-generic", "MIPS64R2-generic"), ("Loongson-2E", "Loongson-2E"), ("Loongson-2F", "Loongson-2F"), )), ("qemu-system-mips64el", ( ("4Kc", "4Kc"), ("4Km", "4Km"), ("4KEcR1", "4KEcR1"), ("4KEmR1", "4KEmR1"), ("4KEc", "4KEc"), ("4KEm", "4KEm"), ("24Kc", "24Kc"), ("24Kf", "24Kf"), ("34Kf", "34Kf"), ("R4000", "R4000"), ("VR5432", "VR5432"), ("5Kc", "5Kc"), ("5Kf", "5Kf"), ("20Kc", "20Kc"), ("MIPS64R2-generic", "MIPS64R2-generic"), ("Loongson-2E", "Loongson-2E"), ("Loongson-2F", "Loongson-2F"), )), ("qemu-system-mipsel", ( ("4Kc", "4Kc"), ("4Km", "4Km"), ("4KEcR1", "4KEcR1"), ("4KEmR1", "4KEmR1"), ("4KEc", "4KEc"), ("4KEm", "4KEm"), ("24Kc", "24Kc"), ("24Kf", "24Kf"), ("34Kf", "34Kf"), )), ("qemu-system-ppc", ( ("401", "401"), ("401A1", "401A1"), ("401B2", "401B2"), ("401C2", "401C2"), ("401D2", "401D2"), ("401E2", "401E2"), ("401F2", "401F2"), ("401G2", "401G2"), ("IOP480", "IOP480"), ("Cobra", "Cobra"), ("403", "403"), ("403GA", "403GA"), ("403GB", "403GB"), ("403GC", "403GC"), ("403GCX", "403GCX"), ("405", "405"), ("405D2", "405D2"), ("405D4", "405D4"), ("405CR", "405CR"), ("405CRa", "405CRa"), ("405CRb", "405CRb"), ("405CRc", "405CRc"), ("405EP", "405EP"), ("405EZ", "405EZ"), ("405GP", "405GP"), ("405GPa", "405GPa"), ("405GPb", "405GPb"), ("405GPc", "405GPc"), ("405GPd", "405GPd"), ("405GPe", "405GPe"), ("405GPR", "405GPR"), ("405LP", "405LP"), ("Npe405H", "Npe405H"), ("Npe405H2", "Npe405H2"), ("Npe405L", "Npe405L"), ("Npe4GS3", "Npe4GS3"), ("STB03", "STB03"), ("STB04", "STB04"), ("STB25", "STB25"), ("x2vp4", "x2vp4"), ("x2vp7", "x2vp7"), ("x2vp20", "x2vp20"), ("x2vp50", "x2vp50"), ("440-Xilinx", "440-Xilinx"), ("440EP", "440EP"), ("440EPa", "440EPa"), ("440EPb", "440EPb"), ("440EPX", "440EPX"), ("MPC52xx", "MPC52xx"), ("MPC82xx", "MPC82xx"), ("PowerQUICC-II", "PowerQUICC-II"), ("G2", "G2"), ("G2H4", "G2H4"), ("G2GP", "G2GP"), ("G2LS", "G2LS"), ("G2HiP3", "G2HiP3"), ("G2HiP4", "G2HiP4"), ("MPC603", "MPC603"), ("G2le", "G2le"), ("G2leGP", "G2leGP"), ("G2leLS", "G2leLS"), ("G2leGP1", "G2leGP1"), ("G2leGP3", "G2leGP3"), ("MPC8240", "MPC8240"), ("MPC5200", "MPC5200"), ("MPC5200_v10", "MPC5200_v10"), ("MPC5200_v11", "MPC5200_v11"), ("MPC5200_v12", "MPC5200_v12"), ("MPC5200B", "MPC5200B"), ("MPC5200B_v20", "MPC5200B_v20"), ("MPC5200B_v21", "MPC5200B_v21"), ("MPC8241", "MPC8241"), ("MPC8245", "MPC8245"), ("MPC8247", "MPC8247"), ("MPC8248", "MPC8248"), ("MPC8250", "MPC8250"), ("MPC8250_HiP3", "MPC8250_HiP3"), ("MPC8250_HiP4", "MPC8250_HiP4"), ("MPC8255", "MPC8255"), ("MPC8255_HiP3", "MPC8255_HiP3"), ("MPC8255_HiP4", "MPC8255_HiP4"), ("MPC8260", "MPC8260"), ("MPC8260_HiP3", "MPC8260_HiP3"), ("MPC8260_HiP4", "MPC8260_HiP4"), ("MPC8264", "MPC8264"), ("MPC8264_HiP3", "MPC8264_HiP3"), ("MPC8264_HiP4", "MPC8264_HiP4"), ("MPC8265", "MPC8265"), ("MPC8265_HiP3", "MPC8265_HiP3"), ("MPC8265_HiP4", "MPC8265_HiP4"), ("MPC8266", "MPC8266"), ("MPC8266_HiP3", "MPC8266_HiP3"), ("MPC8266_HiP4", "MPC8266_HiP4"), ("MPC8270", "MPC8270"), ("MPC8271", "MPC8271"), ("MPC8272", "MPC8272"), ("MPC8275", "MPC8275"), ("MPC8280", "MPC8280"), ("e200", "e200"), ("e200z5", "e200z5"), ("e200z6", "e200z6"), ("e300", "e300"), ("e300c1", "e300c1"), ("e300c2", "e300c2"), ("e300c3", "e300c3"), ("e300c4", "e300c4"), ("MPC8343", "MPC8343"), ("MPC8343A", "MPC8343A"), ("MPC8343E", "MPC8343E"), ("MPC8343EA", "MPC8343EA"), ("MPC8347", "MPC8347"), ("MPC8347T", "MPC8347T"), ("MPC8347P", "MPC8347P"), ("MPC8347A", "MPC8347A"), ("MPC8347AT", "MPC8347AT"), ("MPC8347AP", "MPC8347AP"), ("MPC8347E", "MPC8347E"), ("MPC8347ET", "MPC8347ET"), ("MPC8347EP", "MPC8347EP"), ("MPC8347EA", "MPC8347EA"), ("MPC8347EAT", "MPC8347EAT"), ("MPC8347EAP", "MPC8347EAP"), ("MPC8349", "MPC8349"), ("MPC8349A", "MPC8349A"), ("MPC8349E", "MPC8349E"), ("MPC8349EA", "MPC8349EA"), ("MPC8377", "MPC8377"), ("MPC8377E", "MPC8377E"), ("MPC8378", "MPC8378"), ("MPC8378E", "MPC8378E"), ("MPC8379", "MPC8379"), ("MPC8379E", "MPC8379E"), ("e500", "e500"), ("e500v1", "e500v1"), ("e500_v10", "e500_v10"), ("e500_v20", "e500_v20"), ("e500v2", "e500v2"), ("e500v2_v10", "e500v2_v10"), ("e500v2_v20", "e500v2_v20"), ("e500v2_v21", "e500v2_v21"), ("e500v2_v22", "e500v2_v22"), ("e500v2_v30", "e500v2_v30"), ("e500mc", "e500mc"), ("MPC8533", "MPC8533"), ("MPC8533_v10", "MPC8533_v10"), ("MPC8533_v11", "MPC8533_v11"), ("MPC8533E", "MPC8533E"), ("MPC8533E_v10", "MPC8533E_v10"), ("MPC8533E_v11", "MPC8533E_v11"), ("MPC8540", "MPC8540"), ("MPC8540_v10", "MPC8540_v10"), ("MPC8540_v20", "MPC8540_v20"), ("MPC8540_v21", "MPC8540_v21"), ("MPC8541", "MPC8541"), ("MPC8541_v10", "MPC8541_v10"), ("MPC8541_v11", "MPC8541_v11"), ("MPC8541E", "MPC8541E"), ("MPC8541E_v10", "MPC8541E_v10"), ("MPC8541E_v11", "MPC8541E_v11"), ("MPC8543", "MPC8543"), ("MPC8543_v10", "MPC8543_v10"), ("MPC8543_v11", "MPC8543_v11"), ("MPC8543_v20", "MPC8543_v20"), ("MPC8543_v21", "MPC8543_v21"), ("MPC8543E", "MPC8543E"), ("MPC8543E_v10", "MPC8543E_v10"), ("MPC8543E_v11", "MPC8543E_v11"), ("MPC8543E_v20", "MPC8543E_v20"), ("MPC8543E_v21", "MPC8543E_v21"), ("MPC8544", "MPC8544"), ("MPC8544_v10", "MPC8544_v10"), ("MPC8544_v11", "MPC8544_v11"), ("MPC8544E", "MPC8544E"), ("MPC8544E_v10", "MPC8544E_v10"), ("MPC8544E_v11", "MPC8544E_v11"), ("MPC8545", "MPC8545"), ("MPC8545_v20", "MPC8545_v20"), ("MPC8545_v21", "MPC8545_v21"), ("MPC8545E", "MPC8545E"), ("MPC8545E_v20", "MPC8545E_v20"), ("MPC8545E_v21", "MPC8545E_v21"), ("MPC8547E", "MPC8547E"), ("MPC8547E_v20", "MPC8547E_v20"), ("MPC8547E_v21", "MPC8547E_v21"), ("MPC8548", "MPC8548"), ("MPC8548_v10", "MPC8548_v10"), ("MPC8548_v11", "MPC8548_v11"), ("MPC8548_v20", "MPC8548_v20"), ("MPC8548_v21", "MPC8548_v21"), ("MPC8548E", "MPC8548E"), ("MPC8548E_v10", "MPC8548E_v10"), ("MPC8548E_v11", "MPC8548E_v11"), ("MPC8548E_v20", "MPC8548E_v20"), ("MPC8548E_v21", "MPC8548E_v21"), ("MPC8555", "MPC8555"), ("MPC8555_v10", "MPC8555_v10"), ("MPC8555_v11", "MPC8555_v11"), ("MPC8555E", "MPC8555E"), ("MPC8555E_v10", "MPC8555E_v10"), ("MPC8555E_v11", "MPC8555E_v11"), ("MPC8560", "MPC8560"), ("MPC8560_v10", "MPC8560_v10"), ("MPC8560_v20", "MPC8560_v20"), ("MPC8560_v21", "MPC8560_v21"), ("MPC8567", "MPC8567"), ("MPC8567E", "MPC8567E"), ("MPC8568", "MPC8568"), ("MPC8568E", "MPC8568E"), ("MPC8572", "MPC8572"), ("MPC8572E", "MPC8572E"), ("e600", "e600"), ("MPC8641", "MPC8641"), ("MPC8641D", "MPC8641D"), ("601", "601"), ("601_v0", "601_v0"), ("601_v1", "601_v1"), ("601v", "601v"), ("601_v2", "601_v2"), ("602", "602"), ("603", "603"), ("Vanilla", "Vanilla"), ("603e", "603e"), ("Stretch", "Stretch"), ("603e_v1.1", "603e_v1.1"), ("603e_v1.2", "603e_v1.2"), ("603e_v1.3", "603e_v1.3"), ("603e_v1.4", "603e_v1.4"), ("603e_v2.2", "603e_v2.2"), ("603e_v3", "603e_v3"), ("603e_v4", "603e_v4"), ("603e_v4.1", "603e_v4.1"), ("603e7", "603e7"), ("603e7t", "603e7t"), ("603e7v", "603e7v"), ("Vaillant", "Vaillant"), ("603e7v1", "603e7v1"), ("603e7v2", "603e7v2"), ("603p", "603p"), ("603r", "603r"), ("Goldeneye", "Goldeneye"), ("604", "604"), ("604e", "604e"), ("Sirocco", "Sirocco"), ("604e_v1.0", "604e_v1.0"), ("604e_v2.2", "604e_v2.2"), ("604e_v2.4", "604e_v2.4"), ("604r", "604r"), ("Mach5", "Mach5"), ("740", "740"), ("Arthur", "Arthur"), ("750", "750"), ("Typhoon", "Typhoon"), ("G3", "G3"), ("740_v1.0", "740_v1.0"), ("750_v1.0", "750_v1.0"), ("740_v2.0", "740_v2.0"), ("750_v2.0", "750_v2.0"), ("740_v2.1", "740_v2.1"), ("750_v2.1", "750_v2.1"), ("740_v2.2", "740_v2.2"), ("750_v2.2", "750_v2.2"), ("740_v3.0", "740_v3.0"), ("750_v3.0", "750_v3.0"), ("740_v3.1", "740_v3.1"), ("750_v3.1", "750_v3.1"), ("740e", "740e"), ("750e", "750e"), ("740p", "740p"), ("750p", "750p"), ("Conan/Doyle", "Conan/Doyle"), ("750cl", "750cl"), ("750cl_v1.0", "750cl_v1.0"), ("750cl_v2.0", "750cl_v2.0"), ("750cx", "750cx"), ("750cx_v1.0", "750cx_v1.0"), ("750cx_v2.0", "750cx_v2.0"), ("750cx_v2.1", "750cx_v2.1"), ("750cx_v2.2", "750cx_v2.2"), ("750cxe", "750cxe"), ("750cxe_v2.1", "750cxe_v2.1"), ("750cxe_v2.2", "750cxe_v2.2"), ("750cxe_v2.3", "750cxe_v2.3"), ("750cxe_v2.4", "750cxe_v2.4"), ("750cxe_v2.4b", "750cxe_v2.4b"), ("750cxe_v3.0", "750cxe_v3.0"), ("750cxe_v3.1", "750cxe_v3.1"), ("750cxe_v3.1b", "750cxe_v3.1b"), ("750cxr", "750cxr"), ("750fl", "750fl"), ("750fx", "750fx"), ("750fx_v1.0", "750fx_v1.0"), ("750fx_v2.0", "750fx_v2.0"), ("750fx_v2.1", "750fx_v2.1"), ("750fx_v2.2", "750fx_v2.2"), ("750fx_v2.3", "750fx_v2.3"), ("750gl", "750gl"), ("750gx", "750gx"), ("750gx_v1.0", "750gx_v1.0"), ("750gx_v1.1", "750gx_v1.1"), ("750gx_v1.2", "750gx_v1.2"), ("750l", "750l"), ("LoneStar", "LoneStar"), ("750l_v2.0", "750l_v2.0"), ("750l_v2.1", "750l_v2.1"), ("750l_v2.2", "750l_v2.2"), ("750l_v3.0", "750l_v3.0"), ("750l_v3.2", "750l_v3.2"), ("745", "745"), ("755", "755"), ("Goldfinger", "Goldfinger"), ("745_v1.0", "745_v1.0"), ("755_v1.0", "755_v1.0"), ("745_v1.1", "745_v1.1"), ("755_v1.1", "755_v1.1"), ("745_v2.0", "745_v2.0"), ("755_v2.0", "755_v2.0"), ("745_v2.1", "745_v2.1"), ("755_v2.1", "755_v2.1"), ("745_v2.2", "745_v2.2"), ("755_v2.2", "755_v2.2"), ("745_v2.3", "745_v2.3"), ("755_v2.3", "755_v2.3"), ("745_v2.4", "745_v2.4"), ("755_v2.4", "755_v2.4"), ("745_v2.5", "745_v2.5"), ("755_v2.5", "755_v2.5"), ("745_v2.6", "745_v2.6"), ("755_v2.6", "755_v2.6"), ("745_v2.7", "745_v2.7"), ("755_v2.7", "755_v2.7"), ("745_v2.8", "745_v2.8"), ("755_v2.8", "755_v2.8"), ("7400", "7400"), ("Max", "Max"), ("G4", "G4"), ("7400_v1.0", "7400_v1.0"), ("7400_v1.1", "7400_v1.1"), ("7400_v2.0", "7400_v2.0"), ("7400_v2.1", "7400_v2.1"), ("7400_v2.2", "7400_v2.2"), ("7400_v2.6", "7400_v2.6"), ("7400_v2.7", "7400_v2.7"), ("7400_v2.8", "7400_v2.8"), ("7400_v2.9", "7400_v2.9"), ("7410", "7410"), ("Nitro", "Nitro"), ("7410_v1.0", "7410_v1.0"), ("7410_v1.1", "7410_v1.1"), ("7410_v1.2", "7410_v1.2"), ("7410_v1.3", "7410_v1.3"), ("7410_v1.4", "7410_v1.4"), ("7448", "7448"), ("7448_v1.0", "7448_v1.0"), ("7448_v1.1", "7448_v1.1"), ("7448_v2.0", "7448_v2.0"), ("7448_v2.1", "7448_v2.1"), ("7450", "7450"), ("Vger", "Vger"), ("7450_v1.0", "7450_v1.0"), ("7450_v1.1", "7450_v1.1"), ("7450_v1.2", "7450_v1.2"), ("7450_v2.0", "7450_v2.0"), ("7450_v2.1", "7450_v2.1"), ("7441", "7441"), ("7451", "7451"), ("7441_v2.1", "7441_v2.1"), ("7441_v2.3", "7441_v2.3"), ("7451_v2.3", "7451_v2.3"), ("7441_v2.10", "7441_v2.10"), ("7451_v2.10", "7451_v2.10"), ("7445", "7445"), ("7455", "7455"), ("Apollo6", "Apollo6"), ("7445_v1.0", "7445_v1.0"), ("7455_v1.0", "7455_v1.0"), ("7445_v2.1", "7445_v2.1"), ("7455_v2.1", "7455_v2.1"), ("7445_v3.2", "7445_v3.2"), ("7455_v3.2", "7455_v3.2"), ("7445_v3.3", "7445_v3.3"), ("7455_v3.3", "7455_v3.3"), ("7445_v3.4", "7445_v3.4"), ("7455_v3.4", "7455_v3.4"), ("7447", "7447"), ("7457", "7457"), ("Apollo7", "Apollo7"), ("7447_v1.0", "7447_v1.0"), ("7457_v1.0", "7457_v1.0"), ("7447_v1.1", "7447_v1.1"), ("7457_v1.1", "7457_v1.1"), ("7457_v1.2", "7457_v1.2"), ("7447A", "7447A"), ("7457A", "7457A"), ("7447A_v1.0", "7447A_v1.0"), ("7457A_v1.0", "7457A_v1.0"), ("Apollo7PM", "Apollo7PM"), ("7447A_v1.1", "7447A_v1.1"), ("7457A_v1.1", "7457A_v1.1"), ("7447A_v1.2", "7447A_v1.2"), ("7457A_v1.2", "7457A_v1.2"), ("ppc32", "ppc32"), ("ppc", "ppc"), ("default", "default"), )), ("qemu-system-ppc64", ( ("401", "401"), ("401A1", "401A1"), ("401B2", "401B2"), ("401C2", "401C2"), ("401D2", "401D2"), ("401E2", "401E2"), ("401F2", "401F2"), ("401G2", "401G2"), ("IOP480", "IOP480"), ("Cobra", "Cobra"), ("403", "403"), ("403GA", "403GA"), ("403GB", "403GB"), ("403GC", "403GC"), ("403GCX", "403GCX"), ("405", "405"), ("405D2", "405D2"), ("405D4", "405D4"), ("405CR", "405CR"), ("405CRa", "405CRa"), ("405CRb", "405CRb"), ("405CRc", "405CRc"), ("405EP", "405EP"), ("405EZ", "405EZ"), ("405GP", "405GP"), ("405GPa", "405GPa"), ("405GPb", "405GPb"), ("405GPc", "405GPc"), ("405GPd", "405GPd"), ("405GPe", "405GPe"), ("405GPR", "405GPR"), ("405LP", "405LP"), ("Npe405H", "Npe405H"), ("Npe405H2", "Npe405H2"), ("Npe405L", "Npe405L"), ("Npe4GS3", "Npe4GS3"), ("STB03", "STB03"), ("STB04", "STB04"), ("STB25", "STB25"), ("x2vp4", "x2vp4"), ("x2vp7", "x2vp7"), ("x2vp20", "x2vp20"), ("x2vp50", "x2vp50"), ("440-Xilinx", "440-Xilinx"), ("440EP", "440EP"), ("440EPa", "440EPa"), ("440EPb", "440EPb"), ("440EPX", "440EPX"), ("MPC52xx", "MPC52xx"), ("MPC82xx", "MPC82xx"), ("PowerQUICC-II", "PowerQUICC-II"), ("G2", "G2"), ("G2H4", "G2H4"), ("G2GP", "G2GP"), ("G2LS", "G2LS"), ("G2HiP3", "G2HiP3"), ("G2HiP4", "G2HiP4"), ("MPC603", "MPC603"), ("G2le", "G2le"), ("G2leGP", "G2leGP"), ("G2leLS", "G2leLS"), ("G2leGP1", "G2leGP1"), ("G2leGP3", "G2leGP3"), ("MPC8240", "MPC8240"), ("MPC5200", "MPC5200"), ("MPC5200_v10", "MPC5200_v10"), ("MPC5200_v11", "MPC5200_v11"), ("MPC5200_v12", "MPC5200_v12"), ("MPC5200B", "MPC5200B"), ("MPC5200B_v20", "MPC5200B_v20"), ("MPC5200B_v21", "MPC5200B_v21"), ("MPC8241", "MPC8241"), ("MPC8245", "MPC8245"), ("MPC8247", "MPC8247"), ("MPC8248", "MPC8248"), ("MPC8250", "MPC8250"), ("MPC8250_HiP3", "MPC8250_HiP3"), ("MPC8250_HiP4", "MPC8250_HiP4"), ("MPC8255", "MPC8255"), ("MPC8255_HiP3", "MPC8255_HiP3"), ("MPC8255_HiP4", "MPC8255_HiP4"), ("MPC8260", "MPC8260"), ("MPC8260_HiP3", "MPC8260_HiP3"), ("MPC8260_HiP4", "MPC8260_HiP4"), ("MPC8264", "MPC8264"), ("MPC8264_HiP3", "MPC8264_HiP3"), ("MPC8264_HiP4", "MPC8264_HiP4"), ("MPC8265", "MPC8265"), ("MPC8265_HiP3", "MPC8265_HiP3"), ("MPC8265_HiP4", "MPC8265_HiP4"), ("MPC8266", "MPC8266"), ("MPC8266_HiP3", "MPC8266_HiP3"), ("MPC8266_HiP4", "MPC8266_HiP4"), ("MPC8270", "MPC8270"), ("MPC8271", "MPC8271"), ("MPC8272", "MPC8272"), ("MPC8275", "MPC8275"), ("MPC8280", "MPC8280"), ("e200", "e200"), ("e200z5", "e200z5"), ("e200z6", "e200z6"), ("e300", "e300"), ("e300c1", "e300c1"), ("e300c2", "e300c2"), ("e300c3", "e300c3"), ("e300c4", "e300c4"), ("MPC8343", "MPC8343"), ("MPC8343A", "MPC8343A"), ("MPC8343E", "MPC8343E"), ("MPC8343EA", "MPC8343EA"), ("MPC8347", "MPC8347"), ("MPC8347T", "MPC8347T"), ("MPC8347P", "MPC8347P"), ("MPC8347A", "MPC8347A"), ("MPC8347AT", "MPC8347AT"), ("MPC8347AP", "MPC8347AP"), ("MPC8347E", "MPC8347E"), ("MPC8347ET", "MPC8347ET"), ("MPC8347EP", "MPC8347EP"), ("MPC8347EA", "MPC8347EA"), ("MPC8347EAT", "MPC8347EAT"), ("MPC8347EAP", "MPC8347EAP"), ("MPC8349", "MPC8349"), ("MPC8349A", "MPC8349A"), ("MPC8349E", "MPC8349E"), ("MPC8349EA", "MPC8349EA"), ("MPC8377", "MPC8377"), ("MPC8377E", "MPC8377E"), ("MPC8378", "MPC8378"), ("MPC8378E", "MPC8378E"), ("MPC8379", "MPC8379"), ("MPC8379E", "MPC8379E"), ("e500", "e500"), ("e500v1", "e500v1"), ("e500_v10", "e500_v10"), ("e500_v20", "e500_v20"), ("e500v2", "e500v2"), ("e500v2_v10", "e500v2_v10"), ("e500v2_v20", "e500v2_v20"), ("e500v2_v21", "e500v2_v21"), ("e500v2_v22", "e500v2_v22"), ("e500v2_v30", "e500v2_v30"), ("e500mc", "e500mc"), ("MPC8533", "MPC8533"), ("MPC8533_v10", "MPC8533_v10"), ("MPC8533_v11", "MPC8533_v11"), ("MPC8533E", "MPC8533E"), ("MPC8533E_v10", "MPC8533E_v10"), ("MPC8533E_v11", "MPC8533E_v11"), ("MPC8540", "MPC8540"), ("MPC8540_v10", "MPC8540_v10"), ("MPC8540_v20", "MPC8540_v20"), ("MPC8540_v21", "MPC8540_v21"), ("MPC8541", "MPC8541"), ("MPC8541_v10", "MPC8541_v10"), ("MPC8541_v11", "MPC8541_v11"), ("MPC8541E", "MPC8541E"), ("MPC8541E_v10", "MPC8541E_v10"), ("MPC8541E_v11", "MPC8541E_v11"), ("MPC8543", "MPC8543"), ("MPC8543_v10", "MPC8543_v10"), ("MPC8543_v11", "MPC8543_v11"), ("MPC8543_v20", "MPC8543_v20"), ("MPC8543_v21", "MPC8543_v21"), ("MPC8543E", "MPC8543E"), ("MPC8543E_v10", "MPC8543E_v10"), ("MPC8543E_v11", "MPC8543E_v11"), ("MPC8543E_v20", "MPC8543E_v20"), ("MPC8543E_v21", "MPC8543E_v21"), ("MPC8544", "MPC8544"), ("MPC8544_v10", "MPC8544_v10"), ("MPC8544_v11", "MPC8544_v11"), ("MPC8544E", "MPC8544E"), ("MPC8544E_v10", "MPC8544E_v10"), ("MPC8544E_v11", "MPC8544E_v11"), ("MPC8545", "MPC8545"), ("MPC8545_v20", "MPC8545_v20"), ("MPC8545_v21", "MPC8545_v21"), ("MPC8545E", "MPC8545E"), ("MPC8545E_v20", "MPC8545E_v20"), ("MPC8545E_v21", "MPC8545E_v21"), ("MPC8547E", "MPC8547E"), ("MPC8547E_v20", "MPC8547E_v20"), ("MPC8547E_v21", "MPC8547E_v21"), ("MPC8548", "MPC8548"), ("MPC8548_v10", "MPC8548_v10"), ("MPC8548_v11", "MPC8548_v11"), ("MPC8548_v20", "MPC8548_v20"), ("MPC8548_v21", "MPC8548_v21"), ("MPC8548E", "MPC8548E"), ("MPC8548E_v10", "MPC8548E_v10"), ("MPC8548E_v11", "MPC8548E_v11"), ("MPC8548E_v20", "MPC8548E_v20"), ("MPC8548E_v21", "MPC8548E_v21"), ("MPC8555", "MPC8555"), ("MPC8555_v10", "MPC8555_v10"), ("MPC8555_v11", "MPC8555_v11"), ("MPC8555E", "MPC8555E"), ("MPC8555E_v10", "MPC8555E_v10"), ("MPC8555E_v11", "MPC8555E_v11"), ("MPC8560", "MPC8560"), ("MPC8560_v10", "MPC8560_v10"), ("MPC8560_v20", "MPC8560_v20"), ("MPC8560_v21", "MPC8560_v21"), ("MPC8567", "MPC8567"), ("MPC8567E", "MPC8567E"), ("MPC8568", "MPC8568"), ("MPC8568E", "MPC8568E"), ("MPC8572", "MPC8572"), ("MPC8572E", "MPC8572E"), ("e600", "e600"), ("MPC8641", "MPC8641"), ("MPC8641D", "MPC8641D"), ("601", "601"), ("601_v0", "601_v0"), ("601_v1", "601_v1"), ("601v", "601v"), ("601_v2", "601_v2"), ("602", "602"), ("603", "603"), ("Vanilla", "Vanilla"), ("603e", "603e"), ("Stretch", "Stretch"), ("603e_v1.1", "603e_v1.1"), ("603e_v1.2", "603e_v1.2"), ("603e_v1.3", "603e_v1.3"), ("603e_v1.4", "603e_v1.4"), ("603e_v2.2", "603e_v2.2"), ("603e_v3", "603e_v3"), ("603e_v4", "603e_v4"), ("603e_v4.1", "603e_v4.1"), ("603e7", "603e7"), ("603e7t", "603e7t"), ("603e7v", "603e7v"), ("Vaillant", "Vaillant"), ("603e7v1", "603e7v1"), ("603e7v2", "603e7v2"), ("603p", "603p"), ("603r", "603r"), ("Goldeneye", "Goldeneye"), ("604", "604"), ("604e", "604e"), ("Sirocco", "Sirocco"), ("604e_v1.0", "604e_v1.0"), ("604e_v2.2", "604e_v2.2"), ("604e_v2.4", "604e_v2.4"), ("604r", "604r"), ("Mach5", "Mach5"), ("740", "740"), ("Arthur", "Arthur"), ("750", "750"), ("Typhoon", "Typhoon"), ("G3", "G3"), ("740_v1.0", "740_v1.0"), ("750_v1.0", "750_v1.0"), ("740_v2.0", "740_v2.0"), ("750_v2.0", "750_v2.0"), ("740_v2.1", "740_v2.1"), ("750_v2.1", "750_v2.1"), ("740_v2.2", "740_v2.2"), ("750_v2.2", "750_v2.2"), ("740_v3.0", "740_v3.0"), ("750_v3.0", "750_v3.0"), ("740_v3.1", "740_v3.1"), ("750_v3.1", "750_v3.1"), ("740e", "740e"), ("750e", "750e"), ("740p", "740p"), ("750p", "750p"), ("Conan/Doyle", "Conan/Doyle"), ("750cl", "750cl"), ("750cl_v1.0", "750cl_v1.0"), ("750cl_v2.0", "750cl_v2.0"), ("750cx", "750cx"), ("750cx_v1.0", "750cx_v1.0"), ("750cx_v2.0", "750cx_v2.0"), ("750cx_v2.1", "750cx_v2.1"), ("750cx_v2.2", "750cx_v2.2"), ("750cxe", "750cxe"), ("750cxe_v2.1", "750cxe_v2.1"), ("750cxe_v2.2", "750cxe_v2.2"), ("750cxe_v2.3", "750cxe_v2.3"), ("750cxe_v2.4", "750cxe_v2.4"), ("750cxe_v2.4b", "750cxe_v2.4b"), ("750cxe_v3.0", "750cxe_v3.0"), ("750cxe_v3.1", "750cxe_v3.1"), ("750cxe_v3.1b", "750cxe_v3.1b"), ("750cxr", "750cxr"), ("750fl", "750fl"), ("750fx", "750fx"), ("750fx_v1.0", "750fx_v1.0"), ("750fx_v2.0", "750fx_v2.0"), ("750fx_v2.1", "750fx_v2.1"), ("750fx_v2.2", "750fx_v2.2"), ("750fx_v2.3", "750fx_v2.3"), ("750gl", "750gl"), ("750gx", "750gx"), ("750gx_v1.0", "750gx_v1.0"), ("750gx_v1.1", "750gx_v1.1"), ("750gx_v1.2", "750gx_v1.2"), ("750l", "750l"), ("LoneStar", "LoneStar"), ("750l_v2.0", "750l_v2.0"), ("750l_v2.1", "750l_v2.1"), ("750l_v2.2", "750l_v2.2"), ("750l_v3.0", "750l_v3.0"), ("750l_v3.2", "750l_v3.2"), ("745", "745"), ("755", "755"), ("Goldfinger", "Goldfinger"), ("745_v1.0", "745_v1.0"), ("755_v1.0", "755_v1.0"), ("745_v1.1", "745_v1.1"), ("755_v1.1", "755_v1.1"), ("745_v2.0", "745_v2.0"), ("755_v2.0", "755_v2.0"), ("745_v2.1", "745_v2.1"), ("755_v2.1", "755_v2.1"), ("745_v2.2", "745_v2.2"), ("755_v2.2", "755_v2.2"), ("745_v2.3", "745_v2.3"), ("755_v2.3", "755_v2.3"), ("745_v2.4", "745_v2.4"), ("755_v2.4", "755_v2.4"), ("745_v2.5", "745_v2.5"), ("755_v2.5", "755_v2.5"), ("745_v2.6", "745_v2.6"), ("755_v2.6", "755_v2.6"), ("745_v2.7", "745_v2.7"), ("755_v2.7", "755_v2.7"), ("745_v2.8", "745_v2.8"), ("755_v2.8", "755_v2.8"), ("7400", "7400"), ("Max", "Max"), ("G4", "G4"), ("7400_v1.0", "7400_v1.0"), ("7400_v1.1", "7400_v1.1"), ("7400_v2.0", "7400_v2.0"), ("7400_v2.1", "7400_v2.1"), ("7400_v2.2", "7400_v2.2"), ("7400_v2.6", "7400_v2.6"), ("7400_v2.7", "7400_v2.7"), ("7400_v2.8", "7400_v2.8"), ("7400_v2.9", "7400_v2.9"), ("7410", "7410"), ("Nitro", "Nitro"), ("7410_v1.0", "7410_v1.0"), ("7410_v1.1", "7410_v1.1"), ("7410_v1.2", "7410_v1.2"), ("7410_v1.3", "7410_v1.3"), ("7410_v1.4", "7410_v1.4"), ("7448", "7448"), ("7448_v1.0", "7448_v1.0"), ("7448_v1.1", "7448_v1.1"), ("7448_v2.0", "7448_v2.0"), ("7448_v2.1", "7448_v2.1"), ("7450", "7450"), ("Vger", "Vger"), ("7450_v1.0", "7450_v1.0"), ("7450_v1.1", "7450_v1.1"), ("7450_v1.2", "7450_v1.2"), ("7450_v2.0", "7450_v2.0"), ("7450_v2.1", "7450_v2.1"), ("7441", "7441"), ("7451", "7451"), ("7441_v2.1", "7441_v2.1"), ("7441_v2.3", "7441_v2.3"), ("7451_v2.3", "7451_v2.3"), ("7441_v2.10", "7441_v2.10"), ("7451_v2.10", "7451_v2.10"), ("7445", "7445"), ("7455", "7455"), ("Apollo6", "Apollo6"), ("7445_v1.0", "7445_v1.0"), ("7455_v1.0", "7455_v1.0"), ("7445_v2.1", "7445_v2.1"), ("7455_v2.1", "7455_v2.1"), ("7445_v3.2", "7445_v3.2"), ("7455_v3.2", "7455_v3.2"), ("7445_v3.3", "7445_v3.3"), ("7455_v3.3", "7455_v3.3"), ("7445_v3.4", "7445_v3.4"), ("7455_v3.4", "7455_v3.4"), ("7447", "7447"), ("7457", "7457"), ("Apollo7", "Apollo7"), ("7447_v1.0", "7447_v1.0"), ("7457_v1.0", "7457_v1.0"), ("7447_v1.1", "7447_v1.1"), ("7457_v1.1", "7457_v1.1"), ("7457_v1.2", "7457_v1.2"), ("7447A", "7447A"), ("7457A", "7457A"), ("7447A_v1.0", "7447A_v1.0"), ("7457A_v1.0", "7457A_v1.0"), ("Apollo7PM", "Apollo7PM"), ("7447A_v1.1", "7447A_v1.1"), ("7457A_v1.1", "7457A_v1.1"), ("7447A_v1.2", "7447A_v1.2"), ("7457A_v1.2", "7457A_v1.2"), ("620", "620"), ("Trident", "Trident"), ("POWER7", "POWER7"), ("POWER7_v2.0", "POWER7_v2.0"), ("POWER7_v2.1", "POWER7_v2.1"), ("POWER7_v2.3", "POWER7_v2.3"), ("970", "970"), ("970fx", "970fx"), ("970fx_v1.0", "970fx_v1.0"), ("970fx_v2.0", "970fx_v2.0"), ("970fx_v2.1", "970fx_v2.1"), ("970fx_v3.0", "970fx_v3.0"), ("970fx_v3.1", "970fx_v3.1"), ("970gx", "970gx"), ("970mp", "970mp"), ("970mp_v1.0", "970mp_v1.0"), ("970mp_v1.1", "970mp_v1.1"), ("ppc64", "ppc64"), ("ppc32", "ppc32"), ("ppc", "ppc"), ("default", "default"), )), ("qemu-system-ppcemb", ( ("440-Xilinx", "440-Xilinx"), ("440EP", "440EP"), ("440EPa", "440EPa"), ("440EPb", "440EPb"), ("440EPX", "440EPX"), )), ("qemu-system-s390x", ()), ("qemu-system-sh4", ( ("SH7750R", "SH7750R"), ("SH7751R", "SH7751R"), ("SH7785", "SH7785"), )), ("qemu-system-sh4eb", ( ("SH7750R", "SH7750R"), ("SH7751R", "SH7751R"), ("SH7785", "SH7785"), )), ("qemu-system-sparc", ( # Sparc Fujitsu MB86900 IU 00000000 FPU 00080000 MMU 00000000 NWINS 7 -swap -mul -div -flush -fsqrt -fmul # Sparc Fujitsu MB86904 IU 04000000 FPU 00080000 MMU 04000000 NWINS 8 # Sparc Fujitsu MB86907 IU 05000000 FPU 00080000 MMU 05000000 NWINS 8 # Sparc LSI L64811 IU 10000000 FPU 00020000 MMU 10000000 NWINS 8 -mul -div -flush -fmul # Sparc Cypress CY7C601 IU 11000000 FPU 00060000 MMU 10000000 NWINS 8 -mul -div -flush -fmul # Sparc Cypress CY7C611 IU 13000000 FPU 00060000 MMU 10000000 NWINS 8 -mul -div -flush -fmul # Sparc TI MicroSparc I IU 41000000 FPU 00080000 MMU 41000000 NWINS 7 -fsmuld # Sparc TI MicroSparc II IU 42000000 FPU 00080000 MMU 02000000 NWINS 8 # Sparc TI MicroSparc IIep IU 42000000 FPU 00080000 MMU 04000000 NWINS 8 # Sparc TI SuperSparc 40 IU 41000000 FPU 00000000 MMU 00000800 NWINS 8 # Sparc TI SuperSparc 50 IU 40000000 FPU 00000000 MMU 01000800 NWINS 8 # Sparc TI SuperSparc 51 IU 40000000 FPU 00000000 MMU 01000000 NWINS 8 # Sparc TI SuperSparc 60 IU 40000000 FPU 00000000 MMU 01000800 NWINS 8 # Sparc TI SuperSparc 61 IU 44000000 FPU 00000000 MMU 01000000 NWINS 8 # Sparc TI SuperSparc II IU 40000000 FPU 00000000 MMU 08000000 NWINS 8 # Sparc Ross RT625 IU 1e000000 FPU 00020000 MMU 1e000000 NWINS 8 # Sparc Ross RT620 IU 1f000000 FPU 00020000 MMU 1f000000 NWINS 8 # Sparc BIT B5010 IU 20000000 FPU 00000000 MMU 20000000 NWINS 8 -mul -div -flush -fmul # Sparc Matsushita MN10501 IU 50000000 FPU 00000000 MMU 50000000 NWINS 8 -swap -div -flush -fmul # Sparc Weitek W8601 IU 90000000 FPU 00060000 MMU 10000000 NWINS 8 # Sparc LEON2 IU f2000000 FPU 00080000 MMU f2000000 NWINS 8 # Sparc LEON3 IU f3000000 FPU 00080000 MMU f3000000 NWINS 8 # Default CPU feature flags (use '-' to remove): float swap mul div flush fsqrt fmul fsmuld # Available CPU feature flags (use '+' to add): float128 vis1 vis2 hypv cmt gl # Numerical features (use '=' to set): iu_version fpu_version mmu_version nwindows )), ("qemu-system-sparc64", ( # Sparc Fujitsu Sparc64 IU 0004000200000000 FPU 00000000 MMU 00000000 NWINS 4 # Sparc Fujitsu Sparc64 III IU 0004000300000000 FPU 00000000 MMU 00000000 NWINS 5 # Sparc Fujitsu Sparc64 IV IU 0004000400000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc Fujitsu Sparc64 V IU 0004000551000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc TI UltraSparc I IU 0017001040000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc TI UltraSparc II IU 0017001120000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc TI UltraSparc IIi IU 0017001291000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc TI UltraSparc IIe IU 0017001314000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc Sun UltraSparc III IU 003e001434000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc Sun UltraSparc III Cu IU 003e001541000000 FPU 00000000 MMU 00000001 NWINS 8 # Sparc Sun UltraSparc IIIi IU 003e001634000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc Sun UltraSparc IV IU 003e001831000000 FPU 00000000 MMU 00000002 NWINS 8 # Sparc Sun UltraSparc IV+ IU 003e001922000000 FPU 00000000 MMU 00000000 NWINS 8 +cmt # Sparc Sun UltraSparc IIIi+ IU 003e002200000000 FPU 00000000 MMU 00000001 NWINS 8 # Sparc Sun UltraSparc T1 IU 003e002302000000 FPU 00000000 MMU 00000003 NWINS 8 +hypv +cmt +gl # Sparc Sun UltraSparc T2 IU 003e002402000000 FPU 00000000 MMU 00000003 NWINS 8 +hypv +cmt +gl # Sparc NEC UltraSparc I IU 0022001040000000 FPU 00000000 MMU 00000000 NWINS 8 # Default CPU feature flags (use '-' to remove): float swap mul div flush fsqrt fmul vis1 vis2 fsmuld # Available CPU feature flags (use '+' to add): float128 hypv cmt gl # Numerical features (use '=' to set): iu_version fpu_version mmu_version nwindows )), ("qemu-system-x86_64", ( ("n270", "n270"), ("athlon", "athlon"), ("pentium3", "pentium3"), ("pentium2", "pentium2"), ("pentium", "pentium"), ("486", "486"), ("coreduo", "coreduo"), ("kvm32", "kvm32"), ("qemu32", "qemu32"), ("kvm64", "kvm64"), ("core2duo", "core2duo"), ("phenom", "phenom"), ("qemu64", "qemu64"), )), ("qemu-system-xtensa", ( ("dc233c", "dc233c"), ("dc232b", "dc232b"), )), ("qemu-system-xtensaeb", ( ("fsf", "fsf"), )), ) QEMU_1_1_2_MACHINES = ( ("qemu-system-alpha", ( ("clipper", "Alpha DP264/CLIPPER (default)"), )), ("qemu-system-arm", ( ("collie", "Collie PDA (SA-1110)"), ("nuri", "Samsung NURI board (Exynos4210)"), ("smdkc210", "Samsung SMDKC210 board (Exynos4210)"), ("connex", "Gumstix Connex (PXA255)"), ("verdex", "Gumstix Verdex (PXA270)"), ("highbank", "Calxeda Highbank (ECX-1000)"), ("integratorcp", "ARM Integrator/CP (ARM926EJ-S) (default)"), ("mainstone", "Mainstone II (PXA27x)"), ("musicpal", "Marvell 88w8618 / MusicPal (ARM926EJ-S)"), ("n800", "Nokia N800 tablet aka. RX-34 (OMAP2420)"), ("n810", "Nokia N810 tablet aka. RX-44 (OMAP2420)"), ("sx1", "Siemens SX1 (OMAP310) V2"), ("sx1-v1", "Siemens SX1 (OMAP310) V1"), ("cheetah", "Palm Tungsten|E aka. Cheetah PDA (OMAP310)"), ("realview-eb", "ARM RealView Emulation Baseboard (ARM926EJ-S)"), ("realview-eb-mpcore", "ARM RealView Emulation Baseboard (ARM11MPCore)"), ("realview-pb-a8", "ARM RealView Platform Baseboard for Cortex-A8"), ("realview-pbx-a9", "ARM RealView Platform Baseboard Explore for Cortex-A9"), ("akita", "Akita PDA (PXA270)"), ("spitz", "Spitz PDA (PXA270)"), ("borzoi", "Borzoi PDA (PXA270)"), ("terrier", "Terrier PDA (PXA270)"), ("lm3s811evb", "Stellaris LM3S811EVB"), ("lm3s6965evb", "Stellaris LM3S6965EVB"), ("tosa", "Tosa PDA (PXA255)"), ("versatilepb", "ARM Versatile/PB (ARM926EJ-S)"), ("versatileab", "ARM Versatile/AB (ARM926EJ-S)"), ("vexpress-a9", "ARM Versatile Express for Cortex-A9"), ("vexpress-a15", "ARM Versatile Express for Cortex-A15"), ("xilinx-zynq-a9", "Xilinx Zynq Platform Baseboard for Cortex-A9"), ("z2", "Zipit Z2 (PXA27x)"), )), ("qemu-system-cris", ( ("axis-dev88", "AXIS devboard 88 (default)"), )), ("qemu-system-i386", ( ("pc", "Standard PC (alias of pc-1.1)"), ("pc-1.1", "Standard PC, pc-1.1 (default)"), ("pc-1.0", "Standard PC, pc-1.0"), ("pc-0.15", "Standard PC, pc-0.15"), ("pc-0.14", "Standard PC, pc-0.14"), ("pc-0.13", "Standard PC, pc-0.13"), ("pc-0.12", "Standard PC, pc-0.12"), ("pc-0.11", "Standard PC, qemu 0.11"), ("pc-0.10", "Standard PC, qemu 0.10"), ("isapc", "ISA-only PC"), ("xenfv", "Xen Fully-virtualized PC"), ("xenpv", "Xen Para-virtualized PC"), )), ("qemu-system-lm32", ( ("lm32-uclinux", "lm32 platform for uClinux and u-boot by Theobroma Systems"), ("lm32-evr", "LatticeMico32 EVR32 eval system (default)"), ("milkymist", "Milkymist One"), )), ("qemu-system-m68k", ( ("an5206", "Arnewsh 5206"), ("dummy", "Dummy board"), ("mcf5208evb", "MCF5206EVB (default)"), )), ("qemu-system-microblaze", ( ("petalogix-ml605", "PetaLogix linux refdesign for xilinx ml605 little endian"), ("petalogix-s3adsp1800", "PetaLogix linux refdesign for xilinx Spartan 3ADSP1800 (default)"), )), ("qemu-system-microblazeel", ( ("petalogix-ml605", "PetaLogix linux refdesign for xilinx ml605 little endian"), ("petalogix-s3adsp1800", "PetaLogix linux refdesign for xilinx Spartan 3ADSP1800 (default)"), )), ("qemu-system-mips", ( ("magnum", "MIPS Magnum"), ("pica61", "Acer Pica 61"), ("malta", "MIPS Malta Core LV (default)"), ("mipssim", "MIPS MIPSsim platform"), ("mips", "mips r4k platform"), )), ("qemu-system-mips64", ( ("magnum", "MIPS Magnum"), ("pica61", "Acer Pica 61"), ("malta", "MIPS Malta Core LV (default)"), ("mipssim", "MIPS MIPSsim platform"), ("mips", "mips r4k platform"), )), ("qemu-system-mips64el", ( ("fulong2e", "Fulong 2e mini pc"), ("magnum", "MIPS Magnum"), ("pica61", "Acer Pica 61"), ("malta", "MIPS Malta Core LV (default)"), ("mipssim", "MIPS MIPSsim platform"), ("mips", "mips r4k platform"), )), ("qemu-system-mipsel", ( ("magnum", "MIPS Magnum"), ("pica61", "Acer Pica 61"), ("malta", "MIPS Malta Core LV (default)"), ("mipssim", "MIPS MIPSsim platform"), ("mips", "mips r4k platform"), )), ("qemu-system-ppc", ( ("ref405ep", "ref405ep"), ("taihu", "taihu"), ("bamboo", "bamboo"), ("mac99", "Mac99 based PowerMAC"), ("g3beige", "Heathrow based PowerMAC (default)"), ("prep", "PowerPC PREP platform"), ("mpc8544ds", "mpc8544ds"), ("virtex-ml507", "Xilinx Virtex ML507 reference design"), )), ("qemu-system-ppc64", ( ("ref405ep", "ref405ep"), ("taihu", "taihu"), ("bamboo", "bamboo"), ("mac99", "Mac99 based PowerMAC (default)"), ("g3beige", "Heathrow based PowerMAC"), ("prep", "PowerPC PREP platform"), ("mpc8544ds", "mpc8544ds"), ("pseries", "pSeries Logical Partition (PAPR compliant)"), ("virtex-ml507", "Xilinx Virtex ML507 reference design"), )), ("qemu-system-ppcemb", ( ("ref405ep", "ref405ep"), ("taihu", "taihu"), ("bamboo", "bamboo"), ("mac99", "Mac99 based PowerMAC"), ("g3beige", "Heathrow based PowerMAC (default)"), ("prep", "PowerPC PREP platform"), ("mpc8544ds", "mpc8544ds"), ("virtex-ml507", "Xilinx Virtex ML507 reference design"), )), ("qemu-system-s390x", ( ("s390", "VirtIO based S390 machine (alias of s390-virtio)"), ("s390-virtio", "VirtIO based S390 machine (default)"), )), ("qemu-system-sh4", ( ("r2d", "r2d-plus board"), ("shix", "shix card (default)"), )), ("qemu-system-sh4eb", ( ("r2d", "r2d-plus board"), ("shix", "shix card (default)"), )), ("qemu-system-sparc", ( ("leon3_generic", "Leon-3 generic"), ("SS-5", "Sun4m platform, SPARCstation 5 (default)"), ("SS-10", "Sun4m platform, SPARCstation 10"), ("SS-600MP", "Sun4m platform, SPARCserver 600MP"), ("SS-20", "Sun4m platform, SPARCstation 20"), ("Voyager", "Sun4m platform, SPARCstation Voyager"), ("LX", "Sun4m platform, SPARCstation LX"), ("SS-4", "Sun4m platform, SPARCstation 4"), ("SPARCClassic", "Sun4m platform, SPARCClassic"), ("SPARCbook", "Sun4m platform, SPARCbook"), ("SS-1000", "Sun4d platform, SPARCserver 1000"), ("SS-2000", "Sun4d platform, SPARCcenter 2000"), ("SS-2", "Sun4c platform, SPARCstation 2"), )), ("qemu-system-sparc64", ( ("sun4u", "Sun4u platform (default)"), ("sun4v", "Sun4v platform"), ("Niagara", "Sun4v platform, Niagara"), )), ("qemu-system-x86_64", ( ("pc", "Standard PC (alias of pc-1.1)"), ("pc-1.1", "Standard PC, pc-1.1 (default)"), ("pc-1.0", "Standard PC, pc-1.0"), ("pc-0.15", "Standard PC, pc-0.15"), ("pc-0.14", "Standard PC, pc-0.14"), ("pc-0.13", "Standard PC, pc-0.13"), ("pc-0.12", "Standard PC, pc-0.12"), ("pc-0.11", "Standard PC, qemu 0.11"), ("pc-0.10", "Standard PC, qemu 0.10"), ("isapc", "ISA-only PC"), ("xenfv", "Xen Fully-virtualized PC"), ("xenpv", "Xen Para-virtualized PC"), )), ("qemu-system-xtensa", ( ("lx60", "lx60 EVB (dc232b)"), ("lx200", "lx200 EVB (dc232b)"), ("sim", "sim machine (dc232b)"), )), ("qemu-system-xtensaeb", ( ("lx60", "lx60 EVB (dc232b)"), ("lx200", "lx200 EVB (dc232b)"), ("sim", "sim machine (dc232b)"), )), ) QEMU_2_0_0_BINARIES = ( ("qemu-system-alpha", "alpha"), ("qemu-system-arm", "arm"), ("qemu-system-cris", "cris"), ("qemu-system-i386", "i386"), ("qemu-system-lm32", "lm32"), ("qemu-system-m68k", "m68k"), ("qemu-system-microblaze", "microblaze"), ("qemu-system-microblazeel", "microblazeel"), ("qemu-system-mips", "mips"), ("qemu-system-mips64", "mips64"), ("qemu-system-mips64el", "mips64el"), ("qemu-system-mipsel", "mipsel"), ("qemu-system-moxie", "moxie"), ("qemu-system-or32", "or32"), ("qemu-system-ppc", "ppc"), ("qemu-system-ppc64", "ppc64"), ("qemu-system-ppcemb", "ppcemb"), ("qemu-system-s390x", "s390x"), ("qemu-system-sh4", "sh4"), ("qemu-system-sh4eb", "sh4eb"), ("qemu-system-sparc", "sparc"), ("qemu-system-sparc64", "sparc64"), ("qemu-system-unicore32", "unicore32"), ("qemu-system-x86_64", "x86_64"), ("qemu-system-x86_64-spice", "x86_64-spice"), ("qemu-system-xtensa", "xtensa"), ("qemu-system-xtensaeb", "xtensaeb") ) QEMU_2_0_0_CPUS = ( ("qemu-system-alpha", ( ("ev4-alpha-cpu", "ev4-alpha-cpu"), ("ev5-alpha-cpu", "ev5-alpha-cpu"), ("ev56-alpha-cpu", "ev56-alpha-cpu"), ("ev6-alpha-cpu", "ev6-alpha-cpu"), ("ev67-alpha-cpu", "ev67-alpha-cpu"), ("ev68-alpha-cpu", "ev68-alpha-cpu"), ("pca56-alpha-cpu", "pca56-alpha-cpu"), )), ("qemu-system-arm", ( ("arm1026", "arm1026"), ("arm1136", "arm1136"), ("arm1136-r2", "arm1136-r2"), ("arm1176", "arm1176"), ("arm11mpcore", "arm11mpcore"), ("arm926", "arm926"), ("arm946", "arm946"), ("cortex-a15", "cortex-a15"), ("cortex-a8", "cortex-a8"), ("cortex-a9", "cortex-a9"), ("cortex-m3", "cortex-m3"), ("pxa250", "pxa250"), ("pxa255", "pxa255"), ("pxa260", "pxa260"), ("pxa261", "pxa261"), ("pxa262", "pxa262"), ("pxa270-a0", "pxa270-a0"), ("pxa270-a1", "pxa270-a1"), ("pxa270", "pxa270"), ("pxa270-b0", "pxa270-b0"), ("pxa270-b1", "pxa270-b1"), ("pxa270-c0", "pxa270-c0"), ("pxa270-c5", "pxa270-c5"), ("sa1100", "sa1100"), ("sa1110", "sa1110"), ("ti925t", "ti925t"), )), ("qemu-system-cris", ( ("crisv8", "crisv8"), ("crisv9", "crisv9"), ("crisv10", "crisv10"), ("crisv11", "crisv11"), ("crisv32", "crisv32"), )), ("qemu-system-i386", ( ("qemu64", "QEMU Virtual CPU version 2.0.0"), ("phenom", "AMD Phenom(tm) 9550 Quad-Core Processor"), ("core2duo", "Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz"), ("kvm64", "Common KVM processor"), ("qemu32", "QEMU Virtual CPU version 2.0.0"), ("kvm32", "Common 32-bit KVM processor"), ("coreduo", "Genuine Intel(R) CPU T2600 @ 2.16GHz"), ("486", "486"), ("pentium", "pentium"), ("pentium2", "pentium2"), ("pentium3", "pentium3"), ("athlon", "QEMU Virtual CPU version 2.0.0"), ("n270", "Intel(R) Atom(TM) CPU N270 @ 1.60GHz"), ("Conroe", "Intel Celeron_4x0 (Conroe/Merom Class Core 2)"), ("Penryn", "Intel Core 2 Duo P9xxx (Penryn Class Core 2)"), ("Nehalem", "Intel Core i7 9xx (Nehalem Class Core i7)"), ("Westmere", "Westmere E56xx/L56xx/X56xx (Nehalem-C)"), ("SandyBridge", "Intel Xeon E312xx (Sandy Bridge)"), ("Haswell", "Intel Core Processor (Haswell)"), ("Opteron_G1", "AMD Opteron 240 (Gen 1 Class Opteron)"), ("Opteron_G2", "AMD Opteron 22xx (Gen 2 Class Opteron)"), ("Opteron_G3", "AMD Opteron 23xx (Gen 3 Class Opteron)"), ("Opteron_G4", "AMD Opteron 62xx class CPU"), ("Opteron_G5", "AMD Opteron 63xx class CPU"), ("host", "KVM processor with all supported host features (only available in KVM mode)"), )), ("qemu-system-lm32", ( ("lm32-basic", "lm32-basic"), ("lm32-full", "lm32-full"), ("lm32-standard", "lm32-standard"), )), ("qemu-system-m68k", ( ("cfv4e", "cfv4e"), ("m5206", "m5206"), ("m5208", "m5208"), ("any", "any"), )), ("qemu-system-microblaze", ()), ("qemu-system-microblazeel", ()), ("qemu-system-mips", ( ("4Kc", "4Kc"), ("4Km", "4Km"), ("4KEcR1", "4KEcR1"), ("4KEmR1", "4KEmR1"), ("4KEc", "4KEc"), ("4KEm", "4KEm"), ("24Kc", "24Kc"), ("24Kf", "24Kf"), ("34Kf", "34Kf"), ("74Kf", "74Kf"), ("mips32r5-generic", "mips32r5-generic"), )), ("qemu-system-mips64", ( ("4Kc", "4Kc"), ("4Km", "4Km"), ("4KEcR1", "4KEcR1"), ("4KEmR1", "4KEmR1"), ("4KEc", "4KEc"), ("4KEm", "4KEm"), ("24Kc", "24Kc"), ("24Kf", "24Kf"), ("34Kf", "34Kf"), ("74Kf", "74Kf"), ("mips32r5-generic", "mips32r5-generic"), ("R4000", "R4000"), ("VR5432", "VR5432"), ("5Kc", "5Kc"), ("5Kf", "5Kf"), ("20Kc", "20Kc"), ("MIPS64R2-generic", "MIPS64R2-generic"), ("Loongson-2E", "Loongson-2E"), ("Loongson-2F", "Loongson-2F"), ("mips64dspr2", "mips64dspr2"), )), ("qemu-system-mips64el", ( ("4Kc", "4Kc"), ("4Km", "4Km"), ("4KEcR1", "4KEcR1"), ("4KEmR1", "4KEmR1"), ("4KEc", "4KEc"), ("4KEm", "4KEm"), ("24Kc", "24Kc"), ("24Kf", "24Kf"), ("34Kf", "34Kf"), ("74Kf", "74Kf"), ("mips32r5-generic", "mips32r5-generic"), ("R4000", "R4000"), ("VR5432", "VR5432"), ("5Kc", "5Kc"), ("5Kf", "5Kf"), ("20Kc", "20Kc"), ("MIPS64R2-generic", "MIPS64R2-generic"), ("Loongson-2E", "Loongson-2E"), ("Loongson-2F", "Loongson-2F"), ("mips64dspr2", "mips64dspr2"), )), ("qemu-system-mipsel", ( ("4Kc", "4Kc"), ("4Km", "4Km"), ("4KEcR1", "4KEcR1"), ("4KEmR1", "4KEmR1"), ("4KEc", "4KEc"), ("4KEm", "4KEm"), ("24Kc", "24Kc"), ("24Kf", "24Kf"), ("34Kf", "34Kf"), ("74Kf", "74Kf"), ("mips32r5-generic", "mips32r5-generic"), )), ("qemu-system-moxie", ()), ("qemu-system-or32", ( ("or1200", "or1200"), ("any", "any"), )), ("qemu-system-ppc", ( ("601_v1", "601_v1"), ("601_v0", "601_v0"), ("601_v2", "601_v2"), ("601", "601"), ("601v", "601v"), ("603", "603"), ("MPC8240", "MPC8240"), ("Vanilla", "Vanilla"), ("604", "604"), ("ppc32", "ppc32"), ("ppc", "ppc"), ("default", "default"), ("602", "602"), ("603e_v1.1", "603e_v1.1"), ("603e_v1.2", "603e_v1.2"), ("603e_v1.3", "603e_v1.3"), ("603e_v1.4", "603e_v1.4"), ("603e_v2.2", "603e_v2.2"), ("603e_v3", "603e_v3"), ("603e_v4", "603e_v4"), ("603e_v4.1", "603e_v4.1"), ("603e", "603e"), ("Stretch", "Stretch"), ("603p", "603p"), ("603e7v", "603e7v"), ("Vaillant", "Vaillant"), ("603e7v1", "603e7v1"), ("603e7", "603e7"), ("603e7v2", "603e7v2"), ("603e7t", "603e7t"), ("603r", "603r"), ("Goldeneye", "Goldeneye"), ("750_v1.0", "750_v1.0"), ("740_v1.0", "740_v1.0"), ("740e", "740e"), ("750e", "750e"), ("750_v2.0", "750_v2.0"), ("740_v2.0", "740_v2.0"), ("750_v2.1", "750_v2.1"), ("740_v2.1", "740_v2.1"), ("740_v2.2", "740_v2.2"), ("750_v2.2", "750_v2.2"), ("750_v3.0", "750_v3.0"), ("740_v3.0", "740_v3.0"), ("750_v3.1", "750_v3.1"), ("750", "750"), ("Typhoon", "Typhoon"), ("G3", "G3"), ("740_v3.1", "740_v3.1"), ("740", "740"), ("Arthur", "Arthur"), ("750cx_v1.0", "750cx_v1.0"), ("750cx_v2.0", "750cx_v2.0"), ("750cx_v2.1", "750cx_v2.1"), ("750cx_v2.2", "750cx_v2.2"), ("750cx", "750cx"), ("750cxe_v2.1", "750cxe_v2.1"), ("750cxe_v2.2", "750cxe_v2.2"), ("750cxe_v2.3", "750cxe_v2.3"), ("750cxe_v2.4", "750cxe_v2.4"), ("750cxe_v3.0", "750cxe_v3.0"), ("750cxe_v3.1", "750cxe_v3.1"), ("755_v1.0", "755_v1.0"), ("745_v1.0", "745_v1.0"), ("755_v1.1", "755_v1.1"), ("745_v1.1", "745_v1.1"), ("755_v2.0", "755_v2.0"), ("745_v2.0", "745_v2.0"), ("755_v2.1", "755_v2.1"), ("745_v2.1", "745_v2.1"), ("745_v2.2", "745_v2.2"), ("755_v2.2", "755_v2.2"), ("755_v2.3", "755_v2.3"), ("745_v2.3", "745_v2.3"), ("755_v2.4", "755_v2.4"), ("745_v2.4", "745_v2.4"), ("745_v2.5", "745_v2.5"), ("755_v2.5", "755_v2.5"), ("755_v2.6", "755_v2.6"), ("745_v2.6", "745_v2.6"), ("755_v2.7", "755_v2.7"), ("745_v2.7", "745_v2.7"), ("745_v2.8", "745_v2.8"), ("745", "745"), ("755_v2.8", "755_v2.8"), ("755", "755"), ("Goldfinger", "Goldfinger"), ("750cxe_v2.4b", "750cxe_v2.4b"), ("750cxe_v3.1b", "750cxe_v3.1b"), ("750cxe", "750cxe"), ("750cxr", "750cxr"), ("750cl_v1.0", "750cl_v1.0"), ("750cl_v2.0", "750cl_v2.0"), ("750cl", "750cl"), ("750l_v2.0", "750l_v2.0"), ("750l_v2.1", "750l_v2.1"), ("750l_v2.2", "750l_v2.2"), ("750l_v3.0", "750l_v3.0"), ("750l_v3.2", "750l_v3.2"), ("750l", "750l"), ("LoneStar", "LoneStar"), ("604e_v1.0", "604e_v1.0"), ("604e_v2.2", "604e_v2.2"), ("604e_v2.4", "604e_v2.4"), ("604e", "604e"), ("Sirocco", "Sirocco"), ("604r", "604r"), ("Mach5", "Mach5"), ("7400_v1.0", "7400_v1.0"), ("7400_v1.1", "7400_v1.1"), ("7400_v2.0", "7400_v2.0"), ("7400_v2.1", "7400_v2.1"), ("7400_v2.2", "7400_v2.2"), ("7400_v2.6", "7400_v2.6"), ("7400_v2.7", "7400_v2.7"), ("7400_v2.8", "7400_v2.8"), ("7400_v2.9", "7400_v2.9"), ("7400", "7400"), ("Max", "Max"), ("G4", "G4"), ("403GA", "403GA"), ("403GB", "403GB"), ("403GC", "403GC"), ("403", "403"), ("403GCX", "403GCX"), ("401A1", "401A1"), ("401B2", "401B2"), ("IOP480", "IOP480"), ("401C2", "401C2"), ("401D2", "401D2"), ("401E2", "401E2"), ("401F2", "401F2"), ("401G2", "401G2"), ("401", "401"), ("G2", "G2"), ("MPC603", "MPC603"), ("G2HiP3", "G2HiP3"), ("MPC8250_HiP3", "MPC8250_HiP3"), ("MPC8255_HiP3", "MPC8255_HiP3"), ("MPC8260_HiP3", "MPC8260_HiP3"), ("MPC8264_HiP3", "MPC8264_HiP3"), ("MPC8265_HiP3", "MPC8265_HiP3"), ("MPC8266_HiP3", "MPC8266_HiP3"), ("MPC8347P", "MPC8347P"), ("MPC8349", "MPC8349"), ("MPC8347AP", "MPC8347AP"), ("MPC8343", "MPC8343"), ("MPC8347EAP", "MPC8347EAP"), ("MPC8349E", "MPC8349E"), ("MPC8343A", "MPC8343A"), ("MPC8343EA", "MPC8343EA"), ("MPC8347T", "MPC8347T"), ("MPC8347", "MPC8347"), ("MPC8347ET", "MPC8347ET"), ("MPC8347E", "MPC8347E"), ("MPC8347EAT", "MPC8347EAT"), ("MPC8347EA", "MPC8347EA"), ("MPC8347AT", "MPC8347AT"), ("MPC8347A", "MPC8347A"), ("MPC8349EA", "MPC8349EA"), ("MPC8349A", "MPC8349A"), ("e300c1", "e300c1"), ("MPC8343E", "MPC8343E"), ("MPC8347EP", "MPC8347EP"), ("e300c2", "e300c2"), ("e300c3", "e300c3"), ("e300", "e300"), ("MPC8377", "MPC8377"), ("MPC8377E", "MPC8377E"), ("MPC8379", "MPC8379"), ("MPC8378E", "MPC8378E"), ("e300c4", "e300c4"), ("MPC8378", "MPC8378"), ("MPC8379E", "MPC8379E"), ("750p", "750p"), ("Conan/Doyle", "Conan/Doyle"), ("740p", "740p"), ("Cobra", "Cobra"), ("440EPX", "440EPX"), ("405D2", "405D2"), ("x2vp4", "x2vp4"), ("x2vp7", "x2vp7"), ("x2vp20", "x2vp20"), ("x2vp50", "x2vp50"), ("405GPa", "405GPa"), ("405GPb", "405GPb"), ("405CRa", "405CRa"), ("405GPc", "405GPc"), ("405GPd", "405GPd"), ("405GP", "405GP"), ("405CRb", "405CRb"), ("405CRc", "405CRc"), ("405CR", "405CR"), ("405GPe", "405GPe"), ("STB03", "STB03"), ("Npe4GS3", "Npe4GS3"), ("Npe405H", "Npe405H"), ("Npe405H2", "Npe405H2"), ("405EZ", "405EZ"), ("Npe405L", "Npe405L"), ("STB04", "STB04"), ("405D4", "405D4"), ("405", "405"), ("405LP", "405LP"), ("440EPa", "440EPa"), ("440EPb", "440EPb"), ("440EP", "440EP"), ("405GPR", "405GPR"), ("405EP", "405EP"), ("STB25", "STB25"), ("750fx_v1.0", "750fx_v1.0"), ("750fx_v2.0", "750fx_v2.0"), ("750fx_v2.1", "750fx_v2.1"), ("750fx_v2.2", "750fx_v2.2"), ("750fl", "750fl"), ("750fx_v2.3", "750fx_v2.3"), ("750fx", "750fx"), ("750gx_v1.0", "750gx_v1.0"), ("750gx_v1.1", "750gx_v1.1"), ("750gx_v1.2", "750gx_v1.2"), ("750gx", "750gx"), ("750gl", "750gl"), ("440-Xilinx", "440-Xilinx"), ("7450_v1.0", "7450_v1.0"), ("7450_v1.1", "7450_v1.1"), ("7450_v1.2", "7450_v1.2"), ("7450_v2.0", "7450_v2.0"), ("7450_v2.1", "7450_v2.1"), ("7450", "7450"), ("Vger", "Vger"), ("7441_v2.1", "7441_v2.1"), ("7441_v2.3", "7441_v2.3"), ("7441", "7441"), ("7451_v2.3", "7451_v2.3"), ("7451", "7451"), ("7451_v2.10", "7451_v2.10"), ("7441_v2.10", "7441_v2.10"), ("7455_v1.0", "7455_v1.0"), ("7445_v1.0", "7445_v1.0"), ("7445_v2.1", "7445_v2.1"), ("7455_v2.1", "7455_v2.1"), ("7445_v3.2", "7445_v3.2"), ("7445", "7445"), ("7455_v3.2", "7455_v3.2"), ("7455", "7455"), ("Apollo6", "Apollo6"), ("7455_v3.3", "7455_v3.3"), ("7445_v3.3", "7445_v3.3"), ("7455_v3.4", "7455_v3.4"), ("7445_v3.4", "7445_v3.4"), ("7447_v1.0", "7447_v1.0"), ("7457_v1.0", "7457_v1.0"), ("7457_v1.1", "7457_v1.1"), ("7447_v1.1", "7447_v1.1"), ("7457_v1.2", "7457_v1.2"), ("7457", "7457"), ("Apollo7", "Apollo7"), ("7447A_v1.0", "7447A_v1.0"), ("7457A_v1.0", "7457A_v1.0"), ("Apollo7PM", "Apollo7PM"), ("7457A_v1.1", "7457A_v1.1"), ("7447A_v1.1", "7447A_v1.1"), ("7447A_v1.2", "7447A_v1.2"), ("7447A", "7447A"), ("7457A_v1.2", "7457A_v1.2"), ("7457A", "7457A"), ("MPC8610", "MPC8610"), ("e600", "e600"), ("MPC8641", "MPC8641"), ("MPC8641D", "MPC8641D"), ("7448_v1.0", "7448_v1.0"), ("7448_v1.1", "7448_v1.1"), ("7448_v2.0", "7448_v2.0"), ("7448_v2.1", "7448_v2.1"), ("7448", "7448"), ("7410_v1.0", "7410_v1.0"), ("7410_v1.1", "7410_v1.1"), ("7410_v1.2", "7410_v1.2"), ("7410_v1.3", "7410_v1.3"), ("7410_v1.4", "7410_v1.4"), ("7410", "7410"), ("Nitro", "Nitro"), ("e500_v10", "e500_v10"), ("MPC8540_v10", "MPC8540_v10"), ("e500_v20", "e500_v20"), ("e500v1", "e500v1"), ("MPC8540_v21", "MPC8540_v21"), ("MPC8540", "MPC8540"), ("MPC8541E_v10", "MPC8541E_v10"), ("MPC8541_v10", "MPC8541_v10"), ("MPC8540_v20", "MPC8540_v20"), ("MPC8541E_v11", "MPC8541E_v11"), ("MPC8541E", "MPC8541E"), ("MPC8541_v11", "MPC8541_v11"), ("MPC8541", "MPC8541"), ("MPC8560_v10", "MPC8560_v10"), ("MPC8555_v10", "MPC8555_v10"), ("MPC8548E_v10", "MPC8548E_v10"), ("MPC8548_v10", "MPC8548_v10"), ("MPC8555E_v10", "MPC8555E_v10"), ("MPC8543_v10", "MPC8543_v10"), ("e500v2_v10", "e500v2_v10"), ("MPC8543E_v10", "MPC8543E_v10"), ("MPC8543_v11", "MPC8543_v11"), ("MPC8543E_v11", "MPC8543E_v11"), ("MPC8548E_v11", "MPC8548E_v11"), ("MPC8555_v11", "MPC8555_v11"), ("MPC8555", "MPC8555"), ("MPC8555E_v11", "MPC8555E_v11"), ("MPC8555E", "MPC8555E"), ("MPC8548_v11", "MPC8548_v11"), ("e500v2_v20", "e500v2_v20"), ("MPC8543E_v20", "MPC8543E_v20"), ("MPC8560_v20", "MPC8560_v20"), ("MPC8548E_v20", "MPC8548E_v20"), ("MPC8548_v20", "MPC8548_v20"), ("MPC8543_v20", "MPC8543_v20"), ("MPC8547E_v20", "MPC8547E_v20"), ("MPC8545_v20", "MPC8545_v20"), ("MPC8545E_v20", "MPC8545E_v20"), ("MPC8548E_v21", "MPC8548E_v21"), ("MPC8548E", "MPC8548E"), ("MPC8547E_v21", "MPC8547E_v21"), ("MPC8547E", "MPC8547E"), ("MPC8545_v21", "MPC8545_v21"), ("MPC8545", "MPC8545"), ("MPC8548_v21", "MPC8548_v21"), ("MPC8548", "MPC8548"), ("MPC8543_v21", "MPC8543_v21"), ("MPC8543", "MPC8543"), ("MPC8533E_v10", "MPC8533E_v10"), ("MPC8544_v10", "MPC8544_v10"), ("MPC8545E_v21", "MPC8545E_v21"), ("MPC8545E", "MPC8545E"), ("MPC8533_v10", "MPC8533_v10"), ("e500v2_v21", "e500v2_v21"), ("MPC8544E_v10", "MPC8544E_v10"), ("MPC8543E_v21", "MPC8543E_v21"), ("MPC8543E", "MPC8543E"), ("MPC8560_v21", "MPC8560_v21"), ("MPC8560", "MPC8560"), ("MPC8567E", "MPC8567E"), ("MPC8533E_v11", "MPC8533E_v11"), ("MPC8533E", "MPC8533E"), ("MPC8568", "MPC8568"), ("MPC8533_v11", "MPC8533_v11"), ("MPC8533", "MPC8533"), ("MPC8568E", "MPC8568E"), ("e500v2_v22", "e500v2_v22"), ("e500", "e500"), ("e500v2", "e500v2"), ("MPC8544E_v11", "MPC8544E_v11"), ("MPC8544E", "MPC8544E"), ("MPC8567", "MPC8567"), ("MPC8544_v11", "MPC8544_v11"), ("MPC8544", "MPC8544"), ("MPC8572E", "MPC8572E"), ("e500v2_v30", "e500v2_v30"), ("MPC8572", "MPC8572"), ("e500mc", "e500mc"), ("G2H4", "G2H4"), ("G2HiP4", "G2HiP4"), ("MPC8241", "MPC8241"), ("MPC8245", "MPC8245"), ("MPC8250", "MPC8250"), ("MPC8250_HiP4", "MPC8250_HiP4"), ("MPC8255", "MPC8255"), ("MPC8255_HiP4", "MPC8255_HiP4"), ("MPC8260", "MPC8260"), ("MPC8260_HiP4", "MPC8260_HiP4"), ("MPC8264", "MPC8264"), ("MPC8264_HiP4", "MPC8264_HiP4"), ("MPC8265", "MPC8265"), ("MPC8265_HiP4", "MPC8265_HiP4"), ("MPC8266", "MPC8266"), ("MPC8266_HiP4", "MPC8266_HiP4"), ("G2le", "G2le"), ("G2GP", "G2GP"), ("G2leGP", "G2leGP"), ("MPC5200_v10", "MPC5200_v10"), ("MPC5200B_v21", "MPC5200B_v21"), ("MPC5200B", "MPC5200B"), ("G2leGP1", "G2leGP1"), ("MPC5200_v12", "MPC5200_v12"), ("MPC52xx", "MPC52xx"), ("MPC5200", "MPC5200"), ("MPC5200B_v20", "MPC5200B_v20"), ("MPC5200_v11", "MPC5200_v11"), ("G2leGP3", "G2leGP3"), ("MPC82xx", "MPC82xx"), ("PowerQUICC-II", "PowerQUICC-II"), ("MPC8247", "MPC8247"), ("MPC8248", "MPC8248"), ("MPC8270", "MPC8270"), ("MPC8271", "MPC8271"), ("MPC8272", "MPC8272"), ("MPC8275", "MPC8275"), ("MPC8280", "MPC8280"), ("e200z5", "e200z5"), ("e200z6", "e200z6"), ("e200", "e200"), ("G2LS", "G2LS"), ("G2leLS", "G2leLS"), )), ("qemu-system-ppc64", ( ("601_v0", "601_v0"), ("601_v1", "601_v1"), ("601_v2", "601_v2"), ("601", "601"), ("601v", "601v"), ("603", "603"), ("MPC8240", "MPC8240"), ("Vanilla", "Vanilla"), ("604", "604"), ("ppc32", "ppc32"), ("ppc", "ppc"), ("default", "default"), ("602", "602"), ("603e_v1.1", "603e_v1.1"), ("603e_v1.2", "603e_v1.2"), ("603e_v1.3", "603e_v1.3"), ("603e_v1.4", "603e_v1.4"), ("603e_v2.2", "603e_v2.2"), ("603e_v3", "603e_v3"), ("603e_v4", "603e_v4"), ("603e_v4.1", "603e_v4.1"), ("603e", "603e"), ("Stretch", "Stretch"), ("603p", "603p"), ("603e7v", "603e7v"), ("Vaillant", "Vaillant"), ("603e7v1", "603e7v1"), ("603e7", "603e7"), ("603e7v2", "603e7v2"), ("603e7t", "603e7t"), ("603r", "603r"), ("Goldeneye", "Goldeneye"), ("740_v1.0", "740_v1.0"), ("750_v1.0", "750_v1.0"), ("740e", "740e"), ("740_v2.0", "740_v2.0"), ("750_v2.0", "750_v2.0"), ("750e", "750e"), ("740_v2.1", "740_v2.1"), ("750_v2.1", "750_v2.1"), ("750_v2.2", "750_v2.2"), ("740_v2.2", "740_v2.2"), ("740_v3.0", "740_v3.0"), ("750_v3.0", "750_v3.0"), ("750_v3.1", "750_v3.1"), ("750", "750"), ("Typhoon", "Typhoon"), ("G3", "G3"), ("740_v3.1", "740_v3.1"), ("740", "740"), ("Arthur", "Arthur"), ("750cx_v1.0", "750cx_v1.0"), ("750cx_v2.0", "750cx_v2.0"), ("750cx_v2.1", "750cx_v2.1"), ("750cx_v2.2", "750cx_v2.2"), ("750cx", "750cx"), ("750cxe_v2.1", "750cxe_v2.1"), ("750cxe_v2.2", "750cxe_v2.2"), ("750cxe_v2.3", "750cxe_v2.3"), ("750cxe_v2.4", "750cxe_v2.4"), ("750cxe_v3.0", "750cxe_v3.0"), ("750cxe_v3.1", "750cxe_v3.1"), ("745_v1.0", "745_v1.0"), ("755_v1.0", "755_v1.0"), ("745_v1.1", "745_v1.1"), ("755_v1.1", "755_v1.1"), ("755_v2.0", "755_v2.0"), ("745_v2.0", "745_v2.0"), ("745_v2.1", "745_v2.1"), ("755_v2.1", "755_v2.1"), ("745_v2.2", "745_v2.2"), ("755_v2.2", "755_v2.2"), ("755_v2.3", "755_v2.3"), ("745_v2.3", "745_v2.3"), ("755_v2.4", "755_v2.4"), ("745_v2.4", "745_v2.4"), ("745_v2.5", "745_v2.5"), ("755_v2.5", "755_v2.5"), ("745_v2.6", "745_v2.6"), ("755_v2.6", "755_v2.6"), ("745_v2.7", "745_v2.7"), ("755_v2.7", "755_v2.7"), ("755_v2.8", "755_v2.8"), ("755", "755"), ("Goldfinger", "Goldfinger"), ("745_v2.8", "745_v2.8"), ("745", "745"), ("750cxe_v2.4b", "750cxe_v2.4b"), ("750cxe_v3.1b", "750cxe_v3.1b"), ("750cxe", "750cxe"), ("750cxr", "750cxr"), ("750cl_v1.0", "750cl_v1.0"), ("750cl_v2.0", "750cl_v2.0"), ("750cl", "750cl"), ("750l_v2.0", "750l_v2.0"), ("750l_v2.1", "750l_v2.1"), ("750l_v2.2", "750l_v2.2"), ("750l_v3.0", "750l_v3.0"), ("750l_v3.2", "750l_v3.2"), ("750l", "750l"), ("LoneStar", "LoneStar"), ("604e_v1.0", "604e_v1.0"), ("604e_v2.2", "604e_v2.2"), ("604e_v2.4", "604e_v2.4"), ("604e", "604e"), ("Sirocco", "Sirocco"), ("604r", "604r"), ("Mach5", "Mach5"), ("7400_v1.0", "7400_v1.0"), ("7400_v1.1", "7400_v1.1"), ("7400_v2.0", "7400_v2.0"), ("7400_v2.1", "7400_v2.1"), ("7400_v2.2", "7400_v2.2"), ("7400_v2.6", "7400_v2.6"), ("7400_v2.7", "7400_v2.7"), ("7400_v2.8", "7400_v2.8"), ("7400_v2.9", "7400_v2.9"), ("7400", "7400"), ("Max", "Max"), ("G4", "G4"), ("403GA", "403GA"), ("403GB", "403GB"), ("403GC", "403GC"), ("403", "403"), ("403GCX", "403GCX"), ("401A1", "401A1"), ("IOP480", "IOP480"), ("401B2", "401B2"), ("401C2", "401C2"), ("401D2", "401D2"), ("401E2", "401E2"), ("401F2", "401F2"), ("401", "401"), ("401G2", "401G2"), ("970", "970"), ("970fx_v1.0", "970fx_v1.0"), ("POWER5+", "POWER5+"), ("POWER5gs", "POWER5gs"), ("POWER5+_v2.1", "POWER5+_v2.1"), ("970fx_v2.0", "970fx_v2.0"), ("970fx_v2.1", "970fx_v2.1"), ("970fx_v3.0", "970fx_v3.0"), ("970fx_v3.1", "970fx_v3.1"), ("970fx", "970fx"), ("ppc64", "ppc64"), ("POWER7_v2.0", "POWER7_v2.0"), ("POWER7_v2.1", "POWER7_v2.1"), ("POWER7_v2.3", "POWER7_v2.3"), ("POWER7", "POWER7"), ("970mp_v1.0", "970mp_v1.0"), ("970mp_v1.1", "970mp_v1.1"), ("970mp", "970mp"), ("POWER7+_v2.1", "POWER7+_v2.1"), ("POWER7+", "POWER7+"), ("POWER8_v1.0", "POWER8_v1.0"), ("POWER8", "POWER8"), ("G2", "G2"), ("MPC603", "MPC603"), ("G2HiP3", "G2HiP3"), ("MPC8250_HiP3", "MPC8250_HiP3"), ("MPC8255_HiP3", "MPC8255_HiP3"), ("MPC8260_HiP3", "MPC8260_HiP3"), ("MPC8264_HiP3", "MPC8264_HiP3"), ("MPC8265_HiP3", "MPC8265_HiP3"), ("MPC8266_HiP3", "MPC8266_HiP3"), ("MPC8349EA", "MPC8349EA"), ("MPC8343EA", "MPC8343EA"), ("MPC8347EAT", "MPC8347EAT"), ("MPC8347EA", "MPC8347EA"), ("MPC8347T", "MPC8347T"), ("MPC8347", "MPC8347"), ("MPC8347EP", "MPC8347EP"), ("MPC8343", "MPC8343"), ("MPC8347EAP", "MPC8347EAP"), ("MPC8347P", "MPC8347P"), ("MPC8349", "MPC8349"), ("MPC8347AT", "MPC8347AT"), ("MPC8347A", "MPC8347A"), ("MPC8343E", "MPC8343E"), ("MPC8349E", "MPC8349E"), ("MPC8347AP", "MPC8347AP"), ("MPC8343A", "MPC8343A"), ("e300c1", "e300c1"), ("MPC8349A", "MPC8349A"), ("MPC8347ET", "MPC8347ET"), ("MPC8347E", "MPC8347E"), ("e300c2", "e300c2"), ("e300c3", "e300c3"), ("e300", "e300"), ("MPC8379", "MPC8379"), ("MPC8377E", "MPC8377E"), ("e300c4", "e300c4"), ("MPC8377", "MPC8377"), ("MPC8379E", "MPC8379E"), ("MPC8378", "MPC8378"), ("MPC8378E", "MPC8378E"), ("740p", "740p"), ("750p", "750p"), ("Conan/Doyle", "Conan/Doyle"), ("Cobra", "Cobra"), ("440EPX", "440EPX"), ("405D2", "405D2"), ("x2vp4", "x2vp4"), ("x2vp7", "x2vp7"), ("x2vp20", "x2vp20"), ("x2vp50", "x2vp50"), ("405GPa", "405GPa"), ("405GPb", "405GPb"), ("405CRa", "405CRa"), ("405GPc", "405GPc"), ("405GPd", "405GPd"), ("405GP", "405GP"), ("405CRb", "405CRb"), ("405CRc", "405CRc"), ("405CR", "405CR"), ("405GPe", "405GPe"), ("STB03", "STB03"), ("Npe4GS3", "Npe4GS3"), ("Npe405H", "Npe405H"), ("Npe405H2", "Npe405H2"), ("405EZ", "405EZ"), ("Npe405L", "Npe405L"), ("STB04", "STB04"), ("405D4", "405D4"), ("405", "405"), ("405LP", "405LP"), ("440EPa", "440EPa"), ("440EPb", "440EPb"), ("440EP", "440EP"), ("405GPR", "405GPR"), ("405EP", "405EP"), ("STB25", "STB25"), ("750fx_v1.0", "750fx_v1.0"), ("750fx_v2.0", "750fx_v2.0"), ("750fx_v2.1", "750fx_v2.1"), ("750fx_v2.2", "750fx_v2.2"), ("750fl", "750fl"), ("750fx_v2.3", "750fx_v2.3"), ("750fx", "750fx"), ("750gx_v1.0", "750gx_v1.0"), ("750gx_v1.1", "750gx_v1.1"), ("750gl", "750gl"), ("750gx_v1.2", "750gx_v1.2"), ("750gx", "750gx"), ("440-Xilinx", "440-Xilinx"), ("7450_v1.0", "7450_v1.0"), ("7450_v1.1", "7450_v1.1"), ("7450_v1.2", "7450_v1.2"), ("7450_v2.0", "7450_v2.0"), ("7441_v2.1", "7441_v2.1"), ("7450_v2.1", "7450_v2.1"), ("7450", "7450"), ("Vger", "Vger"), ("7451_v2.3", "7451_v2.3"), ("7451", "7451"), ("7441_v2.3", "7441_v2.3"), ("7441", "7441"), ("7451_v2.10", "7451_v2.10"), ("7441_v2.10", "7441_v2.10"), ("7445_v1.0", "7445_v1.0"), ("7455_v1.0", "7455_v1.0"), ("7455_v2.1", "7455_v2.1"), ("7445_v2.1", "7445_v2.1"), ("7455_v3.2", "7455_v3.2"), ("7455", "7455"), ("Apollo6", "Apollo6"), ("7445_v3.2", "7445_v3.2"), ("7445", "7445"), ("7445_v3.3", "7445_v3.3"), ("7455_v3.3", "7455_v3.3"), ("7445_v3.4", "7445_v3.4"), ("7455_v3.4", "7455_v3.4"), ("7447_v1.0", "7447_v1.0"), ("7457_v1.0", "7457_v1.0"), ("7447_v1.1", "7447_v1.1"), ("7457_v1.1", "7457_v1.1"), ("7457_v1.2", "7457_v1.2"), ("7457", "7457"), ("Apollo7", "Apollo7"), ("7457A_v1.0", "7457A_v1.0"), ("Apollo7PM", "Apollo7PM"), ("7447A_v1.0", "7447A_v1.0"), ("7457A_v1.1", "7457A_v1.1"), ("7447A_v1.1", "7447A_v1.1"), ("7447A_v1.2", "7447A_v1.2"), ("7447A", "7447A"), ("7457A_v1.2", "7457A_v1.2"), ("7457A", "7457A"), ("MPC8610", "MPC8610"), ("MPC8641D", "MPC8641D"), ("e600", "e600"), ("MPC8641", "MPC8641"), ("7448_v1.0", "7448_v1.0"), ("7448_v1.1", "7448_v1.1"), ("7448_v2.0", "7448_v2.0"), ("7448_v2.1", "7448_v2.1"), ("7448", "7448"), ("7410_v1.0", "7410_v1.0"), ("7410_v1.1", "7410_v1.1"), ("7410_v1.2", "7410_v1.2"), ("7410_v1.3", "7410_v1.3"), ("7410_v1.4", "7410_v1.4"), ("7410", "7410"), ("Nitro", "Nitro"), ("e500_v10", "e500_v10"), ("MPC8540_v10", "MPC8540_v10"), ("MPC8541E_v11", "MPC8541E_v11"), ("MPC8541E", "MPC8541E"), ("MPC8541_v10", "MPC8541_v10"), ("MPC8541_v11", "MPC8541_v11"), ("MPC8541", "MPC8541"), ("e500_v20", "e500_v20"), ("e500v1", "e500v1"), ("MPC8540_v20", "MPC8540_v20"), ("MPC8541E_v10", "MPC8541E_v10"), ("MPC8540_v21", "MPC8540_v21"), ("MPC8540", "MPC8540"), ("MPC8555_v10", "MPC8555_v10"), ("MPC8548E_v10", "MPC8548E_v10"), ("MPC8543E_v10", "MPC8543E_v10"), ("MPC8560_v10", "MPC8560_v10"), ("MPC8543_v10", "MPC8543_v10"), ("MPC8555E_v10", "MPC8555E_v10"), ("MPC8548_v10", "MPC8548_v10"), ("e500v2_v10", "e500v2_v10"), ("MPC8548E_v11", "MPC8548E_v11"), ("MPC8555_v11", "MPC8555_v11"), ("MPC8555", "MPC8555"), ("MPC8543E_v11", "MPC8543E_v11"), ("MPC8543_v11", "MPC8543_v11"), ("MPC8555E_v11", "MPC8555E_v11"), ("MPC8555E", "MPC8555E"), ("MPC8548_v11", "MPC8548_v11"), ("MPC8548E_v20", "MPC8548E_v20"), ("MPC8543E_v20", "MPC8543E_v20"), ("MPC8560_v20", "MPC8560_v20"), ("MPC8543_v20", "MPC8543_v20"), ("MPC8548_v20", "MPC8548_v20"), ("MPC8547E_v20", "MPC8547E_v20"), ("e500v2_v20", "e500v2_v20"), ("MPC8545_v20", "MPC8545_v20"), ("MPC8545E_v20", "MPC8545E_v20"), ("MPC8545E_v21", "MPC8545E_v21"), ("MPC8545E", "MPC8545E"), ("MPC8548E_v21", "MPC8548E_v21"), ("MPC8548E", "MPC8548E"), ("MPC8533_v10", "MPC8533_v10"), ("MPC8544_v10", "MPC8544_v10"), ("MPC8543E_v21", "MPC8543E_v21"), ("MPC8543E", "MPC8543E"), ("MPC8560_v21", "MPC8560_v21"), ("MPC8560", "MPC8560"), ("MPC8543_v21", "MPC8543_v21"), ("MPC8543", "MPC8543"), ("MPC8548_v21", "MPC8548_v21"), ("MPC8548", "MPC8548"), ("MPC8544E_v10", "MPC8544E_v10"), ("e500v2_v21", "e500v2_v21"), ("MPC8533E_v10", "MPC8533E_v10"), ("MPC8545_v21", "MPC8545_v21"), ("MPC8545", "MPC8545"), ("MPC8547E_v21", "MPC8547E_v21"), ("MPC8547E", "MPC8547E"), ("MPC8544E_v11", "MPC8544E_v11"), ("MPC8544E", "MPC8544E"), ("MPC8568", "MPC8568"), ("e500v2_v22", "e500v2_v22"), ("e500", "e500"), ("e500v2", "e500v2"), ("MPC8533E_v11", "MPC8533E_v11"), ("MPC8533E", "MPC8533E"), ("MPC8544_v11", "MPC8544_v11"), ("MPC8544", "MPC8544"), ("MPC8533_v11", "MPC8533_v11"), ("MPC8533", "MPC8533"), ("MPC8568E", "MPC8568E"), ("MPC8567E", "MPC8567E"), ("MPC8567", "MPC8567"), ("MPC8572E", "MPC8572E"), ("e500v2_v30", "e500v2_v30"), ("MPC8572", "MPC8572"), ("e500mc", "e500mc"), ("e5500", "e5500"), ("G2H4", "G2H4"), ("G2HiP4", "G2HiP4"), ("MPC8241", "MPC8241"), ("MPC8245", "MPC8245"), ("MPC8250", "MPC8250"), ("MPC8250_HiP4", "MPC8250_HiP4"), ("MPC8255", "MPC8255"), ("MPC8255_HiP4", "MPC8255_HiP4"), ("MPC8260", "MPC8260"), ("MPC8260_HiP4", "MPC8260_HiP4"), ("MPC8264", "MPC8264"), ("MPC8264_HiP4", "MPC8264_HiP4"), ("MPC8265", "MPC8265"), ("MPC8265_HiP4", "MPC8265_HiP4"), ("MPC8266", "MPC8266"), ("MPC8266_HiP4", "MPC8266_HiP4"), ("G2le", "G2le"), ("G2GP", "G2GP"), ("G2leGP", "G2leGP"), ("MPC5200_v10", "MPC5200_v10"), ("MPC5200B_v20", "MPC5200B_v20"), ("MPC5200_v11", "MPC5200_v11"), ("MPC5200B_v21", "MPC5200B_v21"), ("MPC5200B", "MPC5200B"), ("MPC5200_v12", "MPC5200_v12"), ("MPC52xx", "MPC52xx"), ("MPC5200", "MPC5200"), ("G2leGP1", "G2leGP1"), ("G2leGP3", "G2leGP3"), ("MPC82xx", "MPC82xx"), ("PowerQUICC-II", "PowerQUICC-II"), ("MPC8247", "MPC8247"), ("MPC8248", "MPC8248"), ("MPC8270", "MPC8270"), ("MPC8271", "MPC8271"), ("MPC8272", "MPC8272"), ("MPC8275", "MPC8275"), ("MPC8280", "MPC8280"), ("e200z5", "e200z5"), ("e200z6", "e200z6"), ("e200", "e200"), ("G2LS", "G2LS"), ("G2leLS", "G2leLS"), )), ("qemu-system-ppcemb", ( ("403GCX", "403GCX"), ("401B2", "401B2"), ("IOP480", "IOP480"), ("401C2", "401C2"), ("401D2", "401D2"), ("401E2", "401E2"), ("401F2", "401F2"), ("401G2", "401G2"), ("440EPX", "440EPX"), ("405D2", "405D2"), ("x2vp4", "x2vp4"), ("x2vp7", "x2vp7"), ("x2vp20", "x2vp20"), ("x2vp50", "x2vp50"), ("405GPa", "405GPa"), ("405GPb", "405GPb"), ("405CRa", "405CRa"), ("405GPc", "405GPc"), ("405GPd", "405GPd"), ("405GP", "405GP"), ("405CRb", "405CRb"), ("405CRc", "405CRc"), ("405CR", "405CR"), ("405GPe", "405GPe"), ("STB03", "STB03"), ("Npe4GS3", "Npe4GS3"), ("Npe405H", "Npe405H"), ("Npe405H2", "Npe405H2"), ("405EZ", "405EZ"), ("Npe405L", "Npe405L"), ("405D4", "405D4"), ("405", "405"), ("STB04", "STB04"), ("405LP", "405LP"), ("440EPa", "440EPa"), ("440EPb", "440EPb"), ("440EP", "440EP"), ("405GPR", "405GPR"), ("405EP", "405EP"), ("STB25", "STB25"), ("440-Xilinx", "440-Xilinx"), )), ("qemu-system-s390x", ()), ("qemu-system-sh4", ( ("SH7750R", "SH7750R"), ("SH7751R", "SH7751R"), ("SH7785", "SH7785"), )), ("qemu-system-sh4eb", ( ("SH7750R", "SH7750R"), ("SH7751R", "SH7751R"), ("SH7785", "SH7785"), )), ("qemu-system-sparc", ( # XXX # Sparc Fujitsu MB86904 IU 04000000 FPU 00080000 MMU 04000000 NWINS 8 # Sparc Fujitsu MB86907 IU 05000000 FPU 00080000 MMU 05000000 NWINS 8 # Sparc TI MicroSparc I IU 41000000 FPU 00080000 MMU 41000000 NWINS 7 -fsmuld # Sparc TI MicroSparc II IU 42000000 FPU 00080000 MMU 02000000 NWINS 8 # Sparc TI MicroSparc IIep IU 42000000 FPU 00080000 MMU 04000000 NWINS 8 # Sparc TI SuperSparc 40 IU 41000000 FPU 00000000 MMU 00000800 NWINS 8 # Sparc TI SuperSparc 50 IU 40000000 FPU 00000000 MMU 01000800 NWINS 8 # Sparc TI SuperSparc 51 IU 40000000 FPU 00000000 MMU 01000000 NWINS 8 # Sparc TI SuperSparc 60 IU 40000000 FPU 00000000 MMU 01000800 NWINS 8 # Sparc TI SuperSparc 61 IU 44000000 FPU 00000000 MMU 01000000 NWINS 8 # Sparc TI SuperSparc II IU 40000000 FPU 00000000 MMU 08000000 NWINS 8 # Sparc LEON2 IU f2000000 FPU 00080000 MMU f2000000 NWINS 8 # Sparc LEON3 IU f3000000 FPU 00080000 MMU f3000000 NWINS 8 # Default CPU feature flags (use '-' to remove): float swap mul div flush fsqrt fmul fsmuld # Available CPU feature flags (use '+' to add): float128 vis1 vis2 hypv cmt gl # Numerical features (use '=' to set): iu_version fpu_version mmu_version nwindows )), ("qemu-system-sparc64", ( # XXX # Sparc Fujitsu Sparc64 IU 0004000200000000 FPU 00000000 MMU 00000000 NWINS 4 # Sparc Fujitsu Sparc64 III IU 0004000300000000 FPU 00000000 MMU 00000000 NWINS 5 # Sparc Fujitsu Sparc64 IV IU 0004000400000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc Fujitsu Sparc64 V IU 0004000551000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc TI UltraSparc I IU 0017001040000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc TI UltraSparc II IU 0017001120000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc TI UltraSparc IIi IU 0017001291000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc TI UltraSparc IIe IU 0017001314000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc Sun UltraSparc III IU 003e001434000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc Sun UltraSparc III Cu IU 003e001541000000 FPU 00000000 MMU 00000001 NWINS 8 # Sparc Sun UltraSparc IIIi IU 003e001634000000 FPU 00000000 MMU 00000000 NWINS 8 # Sparc Sun UltraSparc IV IU 003e001831000000 FPU 00000000 MMU 00000002 NWINS 8 # Sparc Sun UltraSparc IV+ IU 003e001922000000 FPU 00000000 MMU 00000000 NWINS 8 +cmt # Sparc Sun UltraSparc IIIi+ IU 003e002200000000 FPU 00000000 MMU 00000001 NWINS 8 # Sparc Sun UltraSparc T1 IU 003e002302000000 FPU 00000000 MMU 00000003 NWINS 8 +hypv +cmt +gl # Sparc Sun UltraSparc T2 IU 003e002402000000 FPU 00000000 MMU 00000003 NWINS 8 +hypv +cmt +gl # Sparc NEC UltraSparc I IU 0022001040000000 FPU 00000000 MMU 00000000 NWINS 8 # Default CPU feature flags (use '-' to remove): float swap mul div flush fsqrt fmul vis1 vis2 fsmuld # Available CPU feature flags (use '+' to add): float128 hypv cmt gl # Numerical features (use '=' to set): iu_version fpu_version mmu_version nwindows )), ("qemu-system-unicore32", ()), ("qemu-system-x86_64", ( ("qemu64", "QEMU Virtual CPU version 2.0.0"), ("phenom", "AMD Phenom(tm) 9550 Quad-Core Processor"), ("core2duo", "Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz"), ("kvm64", "Common KVM processor"), ("qemu32", "QEMU Virtual CPU version 2.0.0"), ("kvm32", "Common 32-bit KVM processor"), ("coreduo", "Genuine Intel(R) CPU T2600 @ 2.16GHz"), ("486", "486"), ("pentium", "pentium"), ("pentium2", "pentium2"), ("pentium3", "pentium3"), ("athlon", "QEMU Virtual CPU version 2.0.0"), ("n270", "Intel(R) Atom(TM) CPU N270 @ 1.60GHz"), ("Conroe", "Intel Celeron_4x0 (Conroe/Merom Class Core 2)"), ("Penryn", "Intel Core 2 Duo P9xxx (Penryn Class Core 2)"), ("Nehalem", "Intel Core i7 9xx (Nehalem Class Core i7)"), ("Westmere", "Westmere E56xx/L56xx/X56xx (Nehalem-C)"), ("SandyBridge", "Intel Xeon E312xx (Sandy Bridge)"), ("Haswell", "Intel Core Processor (Haswell)"), ("Opteron_G1", "AMD Opteron 240 (Gen 1 Class Opteron)"), ("Opteron_G2", "AMD Opteron 22xx (Gen 2 Class Opteron)"), ("Opteron_G3", "AMD Opteron 23xx (Gen 3 Class Opteron)"), ("Opteron_G4", "AMD Opteron 62xx class CPU"), ("Opteron_G5", "AMD Opteron 63xx class CPU"), ("host", "KVM processor with all supported host features (only available in KVM mode)"), )), ("qemu-system-x86_64-spice", ( ("qemu64", "QEMU Virtual CPU version 2.0.0"), ("phenom", "AMD Phenom(tm) 9550 Quad-Core Processor"), ("core2duo", "Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz"), ("kvm64", "Common KVM processor"), ("qemu32", "QEMU Virtual CPU version 2.0.0"), ("kvm32", "Common 32-bit KVM processor"), ("coreduo", "Genuine Intel(R) CPU T2600 @ 2.16GHz"), ("486", "486"), ("pentium", "pentium"), ("pentium2", "pentium2"), ("pentium3", "pentium3"), ("athlon", "QEMU Virtual CPU version 2.0.0"), ("n270", "Intel(R) Atom(TM) CPU N270 @ 1.60GHz"), ("Conroe", "Intel Celeron_4x0 (Conroe/Merom Class Core 2)"), ("Penryn", "Intel Core 2 Duo P9xxx (Penryn Class Core 2)"), ("Nehalem", "Intel Core i7 9xx (Nehalem Class Core i7)"), ("Westmere", "Westmere E56xx/L56xx/X56xx (Nehalem-C)"), ("SandyBridge", "Intel Xeon E312xx (Sandy Bridge)"), ("Haswell", "Intel Core Processor (Haswell)"), ("Opteron_G1", "AMD Opteron 240 (Gen 1 Class Opteron)"), ("Opteron_G2", "AMD Opteron 22xx (Gen 2 Class Opteron)"), ("Opteron_G3", "AMD Opteron 23xx (Gen 3 Class Opteron)"), ("Opteron_G4", "AMD Opteron 62xx class CPU"), ("Opteron_G5", "AMD Opteron 63xx class CPU"), ("host", "KVM processor with all supported host features (only available in KVM mode)"), )), ("qemu-system-xtensa", ( ("dc233c", "dc233c"), ("dc232b", "dc232b"), )), ("qemu-system-xtensaeb", ( ("fsf", "fsf"), )), ) QEMU_2_0_0_MACHINES = ( ("qemu-system-alpha", ( ("clipper", "Alpha DP264/CLIPPER (default)"), )), ("qemu-system-arm", ( ("versatileab", "ARM Versatile/AB (ARM926EJ-S)"), ("versatilepb", "ARM Versatile/PB (ARM926EJ-S)"), ("lm3s811evb", "Stellaris LM3S811EVB"), ("z2", "Zipit Z2 (PXA27x)"), ("connex", "Gumstix Connex (PXA255)"), ("sx1", "Siemens SX1 (OMAP310) V2"), ("realview-eb", "ARM RealView Emulation Baseboard (ARM926EJ-S)"), ("cubieboard", "cubietech cubieboard"), ("vexpress-a9", "ARM Versatile Express for Cortex-A9"), ("lm3s6965evb", "Stellaris LM3S6965EVB"), ("realview-pbx-a9", "ARM RealView Platform Baseboard Explore for Cortex-A9"), ("musicpal", "Marvell 88w8618 / MusicPal (ARM926EJ-S)"), ("mainstone", "Mainstone II (PXA27x)"), ("terrier", "Terrier PDA (PXA270)"), ("n810", "Nokia N810 tablet aka. RX-44 (OMAP2420)"), ("xilinx-zynq-a9", "Xilinx Zynq Platform Baseboard for Cortex-A9"), ("nuri", "Samsung NURI board (Exynos4210)"), ("realview-eb-mpcore", "ARM RealView Emulation Baseboard (ARM11MPCore)"), ("verdex", "Gumstix Verdex (PXA270)"), ("spitz", "Spitz PDA (PXA270)"), ("canon-a1100", "Canon PowerShot A1100 IS"), ("akita", "Akita PDA (PXA270)"), ("smdkc210", "Samsung SMDKC210 board (Exynos4210)"), ("integratorcp", "ARM Integrator/CP (ARM926EJ-S) (default)"), ("sx1-v1", "Siemens SX1 (OMAP310) V1"), ("kzm", "ARM KZM Emulation Baseboard (ARM1136)"), ("highbank", "Calxeda Highbank (ECX-1000)"), ("n800", "Nokia N800 tablet aka. RX-34 (OMAP2420)"), ("collie", "Collie PDA (SA-1110)"), ("realview-pb-a8", "ARM RealView Platform Baseboard for Cortex-A8"), ("vexpress-a15", "ARM Versatile Express for Cortex-A15"), ("none", "empty machine"), ("cheetah", "Palm Tungsten|E aka. Cheetah PDA (OMAP310)"), ("tosa", "Tosa PDA (PXA255)"), ("midway", "Calxeda Midway (ECX-2000)"), ("virt", "ARM Virtual Machine"), ("borzoi", "Borzoi PDA (PXA270)"), )), ("qemu-system-cris", ( ("axis-dev88", "AXIS devboard 88 (default)"), ("none", "empty machine"), )), ("qemu-system-i386", ( ("pc-0.13", "Standard PC (i440FX + PIIX, 1996)"), ("pc-i440fx-2.0", "Standard PC (i440FX + PIIX, 1996)"), ("pc-1.0", "Standard PC (i440FX + PIIX, 1996)"), ("pc-q35-1.7", "Standard PC (Q35 + ICH9, 2009)"), ("pc-1.1", "Standard PC (i440FX + PIIX, 1996)"), ("pc-i440fx-1.4", "Standard PC (i440FX + PIIX, 1996)"), ("q35", "Standard PC (Q35 + ICH9, 2009) (alias of pc-q35-2.0)"), ("pc-q35-2.0", "Standard PC (Q35 + ICH9, 2009)"), ("pc-i440fx-1.5", "Standard PC (i440FX + PIIX, 1996)"), ("pc-0.14", "Standard PC (i440FX + PIIX, 1996)"), ("pc-0.15", "Standard PC (i440FX + PIIX, 1996)"), ("xenfv", "Xen Fully-virtualized PC"), ("pc-q35-1.4", "Standard PC (Q35 + ICH9, 2009)"), ("isapc", "ISA-only PC"), ("pc", "Ubuntu 14.04 PC (i440FX + PIIX, 1996) (alias of pc-i440fx-trusty)"), ("pc-i440fx-trusty", "Ubuntu 14.04 PC (i440FX + PIIX, 1996) (default)"), ("pc-1.2", "Standard PC (i440FX + PIIX, 1996)"), ("pc-0.10", "Standard PC (i440FX + PIIX, 1996)"), ("pc-0.11", "Standard PC (i440FX + PIIX, 1996)"), ("pc-i440fx-1.7", "Standard PC (i440FX + PIIX, 1996)"), ("pc-i440fx-1.6", "Standard PC (i440FX + PIIX, 1996)"), ("none", "empty machine"), ("xenpv", "Xen Para-virtualized PC"), ("pc-q35-1.5", "Standard PC (Q35 + ICH9, 2009)"), ("pc-q35-1.6", "Standard PC (Q35 + ICH9, 2009)"), ("pc-1.3", "Standard PC (i440FX + PIIX, 1996)"), ("pc-0.12", "Standard PC (i440FX + PIIX, 1996)"), )), ("qemu-system-lm32", ( ("lm32-uclinux", "lm32 platform for uClinux and u-boot by Theobroma Systems"), ("milkymist", "Milkymist One"), ("none", "empty machine"), ("lm32-evr", "LatticeMico32 EVR32 eval system (default)"), )), ("qemu-system-m68k", ( ("an5206", "Arnewsh 5206"), ("mcf5208evb", "MCF5206EVB (default)"), ("none", "empty machine"), ("dummy", "Dummy board"), )), ("qemu-system-microblaze", ( ("petalogix-ml605", "PetaLogix linux refdesign for xilinx ml605 little endian"), ("petalogix-s3adsp1800", "PetaLogix linux refdesign for xilinx Spartan 3ADSP1800 (default)"), ("none", "empty machine"), )), ("qemu-system-microblazeel", ( ("petalogix-ml605", "PetaLogix linux refdesign for xilinx ml605 little endian"), ("petalogix-s3adsp1800", "PetaLogix linux refdesign for xilinx Spartan 3ADSP1800 (default)"), ("none", "empty machine"), )), ("qemu-system-mips", ( ("pica61", "Acer Pica 61"), ("malta", "MIPS Malta Core LV (default)"), ("none", "empty machine"), ("mips", "mips r4k platform"), ("magnum", "MIPS Magnum"), ("mipssim", "MIPS MIPSsim platform"), )), ("qemu-system-mips64", ( ("pica61", "Acer Pica 61"), ("malta", "MIPS Malta Core LV (default)"), ("none", "empty machine"), ("mips", "mips r4k platform"), ("magnum", "MIPS Magnum"), ("mipssim", "MIPS MIPSsim platform"), )), ("qemu-system-mips64el", ( ("pica61", "Acer Pica 61"), ("malta", "MIPS Malta Core LV (default)"), ("none", "empty machine"), ("mips", "mips r4k platform"), ("fulong2e", "Fulong 2e mini pc"), ("magnum", "MIPS Magnum"), ("mipssim", "MIPS MIPSsim platform"), )), ("qemu-system-mipsel", ( ("pica61", "Acer Pica 61"), ("malta", "MIPS Malta Core LV (default)"), ("none", "empty machine"), ("mips", "mips r4k platform"), ("magnum", "MIPS Magnum"), ("mipssim", "MIPS MIPSsim platform"), )), ("qemu-system-moxie", ( ("moxiesim", "Moxie simulator platform (default)"), ("none", "empty machine"), )), ("qemu-system-or32", ( ("or32-sim", "or32 simulation (default)"), ("none", "empty machine"), )), ("qemu-system-ppc", ( ("taihu", "taihu"), ("mac99", "Mac99 based PowerMAC"), ("prep", "PowerPC PREP platform"), ("g3beige", "Heathrow based PowerMAC (default)"), ("bamboo", "bamboo"), ("mpc8544ds", "mpc8544ds"), ("ppce500", "generic paravirt e500 platform"), ("virtex-ml507", "Xilinx Virtex ML507 reference design"), ("none", "empty machine"), ("ref405ep", "ref405ep"), )), ("qemu-system-ppc64", ( ("taihu", "taihu"), ("mac99", "Mac99 based PowerMAC"), ("pseries", "pSeries Logical Partition (PAPR compliant) (default)"), ("prep", "PowerPC PREP platform"), ("g3beige", "Heathrow based PowerMAC"), ("bamboo", "bamboo"), ("mpc8544ds", "mpc8544ds"), ("ppce500", "generic paravirt e500 platform"), ("virtex-ml507", "Xilinx Virtex ML507 reference design"), ("none", "empty machine"), ("ref405ep", "ref405ep"), )), ("qemu-system-ppcemb", ( ("taihu", "taihu"), ("bamboo", "bamboo"), ("virtex-ml507", "Xilinx Virtex ML507 reference design"), ("none", "empty machine"), ("ref405ep", "ref405ep"), )), ("qemu-system-s390x", ( ("s390-ccw", "VirtIO-ccw based S390 machine (alias of s390-ccw-virtio)"), ("s390-ccw-virtio", "VirtIO-ccw based S390 machine"), ("s390", "VirtIO based S390 machine (alias of s390-virtio)"), ("s390-virtio", "VirtIO based S390 machine (default)"), ("none", "empty machine"), )), ("qemu-system-sh4", ( ("shix", "shix card (default)"), ("r2d", "r2d-plus board"), ("none", "empty machine"), )), ("qemu-system-sh4eb", ( ("shix", "shix card (default)"), ("r2d", "r2d-plus board"), ("none", "empty machine"), )), ("qemu-system-sparc", ( ("LX", "Sun4m platform, SPARCstation LX"), ("leon3_generic", "Leon-3 generic"), ("SS-20", "Sun4m platform, SPARCstation 20"), ("SPARCClassic", "Sun4m platform, SPARCClassic"), ("SS-10", "Sun4m platform, SPARCstation 10"), ("Voyager", "Sun4m platform, SPARCstation Voyager"), ("SS-600MP", "Sun4m platform, SPARCserver 600MP"), ("SPARCbook", "Sun4m platform, SPARCbook"), ("none", "empty machine"), ("SS-4", "Sun4m platform, SPARCstation 4"), ("SS-5", "Sun4m platform, SPARCstation 5 (default)"), )), ("qemu-system-sparc64", ( ("sun4u", "Sun4u platform (default)"), ("sun4v", "Sun4v platform"), ("Niagara", "Sun4v platform, Niagara"), ("none", "empty machine"), )), ("qemu-system-unicore32", ( ("puv3", "PKUnity Version-3 based on UniCore32 (default)"), ("none", "empty machine"), )), ("qemu-system-x86_64", ( ("pc-0.13", "Standard PC (i440FX + PIIX, 1996)"), ("pc-i440fx-2.0", "Standard PC (i440FX + PIIX, 1996)"), ("pc-1.0", "Standard PC (i440FX + PIIX, 1996)"), ("pc-q35-1.7", "Standard PC (Q35 + ICH9, 2009)"), ("pc-1.1", "Standard PC (i440FX + PIIX, 1996)"), ("q35", "Standard PC (Q35 + ICH9, 2009) (alias of pc-q35-2.0)"), ("pc-q35-2.0", "Standard PC (Q35 + ICH9, 2009)"), ("pc-i440fx-1.4", "Standard PC (i440FX + PIIX, 1996)"), ("pc-i440fx-1.5", "Standard PC (i440FX + PIIX, 1996)"), ("pc-0.14", "Standard PC (i440FX + PIIX, 1996)"), ("pc-0.15", "Standard PC (i440FX + PIIX, 1996)"), ("xenfv", "Xen Fully-virtualized PC"), ("pc-q35-1.4", "Standard PC (Q35 + ICH9, 2009)"), ("isapc", "ISA-only PC"), ("pc-0.10", "Standard PC (i440FX + PIIX, 1996)"), ("pc", "Ubuntu 14.04 PC (i440FX + PIIX, 1996) (alias of pc-i440fx-trusty)"), ("pc-i440fx-trusty", "Ubuntu 14.04 PC (i440FX + PIIX, 1996) (default)"), ("pc-1.2", "Standard PC (i440FX + PIIX, 1996)"), ("pc-0.11", "Standard PC (i440FX + PIIX, 1996)"), ("pc-i440fx-1.7", "Standard PC (i440FX + PIIX, 1996)"), ("pc-i440fx-1.6", "Standard PC (i440FX + PIIX, 1996)"), ("none", "empty machine"), ("xenpv", "Xen Para-virtualized PC"), ("pc-q35-1.5", "Standard PC (Q35 + ICH9, 2009)"), ("pc-q35-1.6", "Standard PC (Q35 + ICH9, 2009)"), ("pc-0.12", "Standard PC (i440FX + PIIX, 1996)"), ("pc-1.3", "Standard PC (i440FX + PIIX, 1996)"), )), ("qemu-system-x86_64-spice", ( ("pc-0.13", "Standard PC (i440FX + PIIX, 1996)"), ("pc-i440fx-2.0", "Standard PC (i440FX + PIIX, 1996)"), ("pc-1.0", "Standard PC (i440FX + PIIX, 1996)"), ("pc-q35-1.7", "Standard PC (Q35 + ICH9, 2009)"), ("pc-1.1", "Standard PC (i440FX + PIIX, 1996)"), ("q35", "Standard PC (Q35 + ICH9, 2009) (alias of pc-q35-2.0)"), ("pc-q35-2.0", "Standard PC (Q35 + ICH9, 2009)"), ("pc-i440fx-1.4", "Standard PC (i440FX + PIIX, 1996)"), ("pc-i440fx-1.5", "Standard PC (i440FX + PIIX, 1996)"), ("pc-0.14", "Standard PC (i440FX + PIIX, 1996)"), ("pc-0.15", "Standard PC (i440FX + PIIX, 1996)"), ("xenfv", "Xen Fully-virtualized PC"), ("pc-q35-1.4", "Standard PC (Q35 + ICH9, 2009)"), ("isapc", "ISA-only PC"), ("pc-0.10", "Standard PC (i440FX + PIIX, 1996)"), ("pc", "Ubuntu 14.04 PC (i440FX + PIIX, 1996) (alias of pc-i440fx-trusty)"), ("pc-i440fx-trusty", "Ubuntu 14.04 PC (i440FX + PIIX, 1996) (default)"), ("pc-1.2", "Standard PC (i440FX + PIIX, 1996)"), ("pc-0.11", "Standard PC (i440FX + PIIX, 1996)"), ("pc-i440fx-1.7", "Standard PC (i440FX + PIIX, 1996)"), ("pc-i440fx-1.6", "Standard PC (i440FX + PIIX, 1996)"), ("none", "empty machine"), ("xenpv", "Xen Para-virtualized PC"), ("pc-q35-1.5", "Standard PC (Q35 + ICH9, 2009)"), ("pc-q35-1.6", "Standard PC (Q35 + ICH9, 2009)"), ("pc-0.12", "Standard PC (i440FX + PIIX, 1996)"), ("pc-1.3", "Standard PC (i440FX + PIIX, 1996)"), )), ("qemu-system-xtensa", ( ("lx200", "lx200 EVB (dc232b)"), ("ml605", "ml605 EVB (dc232b)"), ("kc705", "kc705 EVB (dc232b)"), ("lx60", "lx60 EVB (dc232b)"), ("none", "empty machine"), ("sim", "sim machine (dc232b) (default)"), )), ("qemu-system-xtensaeb", ( ("lx60", "lx60 EVB (fsf)"), ("lx200", "lx200 EVB (fsf)"), ("ml605", "ml605 EVB (fsf)"), ("kc705", "kc705 EVB (fsf)"), ("none", "empty machine"), ("sim", "sim machine (fsf) (default)"), )), ) QEMU_BINARIES = ( ("1.0", QEMU_1_0_BINARIES), ("1.1.2", QEMU_1_1_2_BINARIES), ("2.0.0", QEMU_2_0_0_BINARIES), ) QEMU_CPUS = ( ("1.0", QEMU_1_0_CPUS), ("1.1.2", QEMU_1_1_2_CPUS), ("2.0.0", QEMU_2_0_0_CPUS), ) QEMU_MACHINES = ( ("1.0", QEMU_1_0_MACHINES), ("1.1.2", QEMU_1_1_2_MACHINES), ("2.0.0", QEMU_2_0_0_MACHINES), ) QEMU_VERSIONS = ( "1.0", "1.1.2", "2.0.0", ) def _get_matching_tuple(tpl, key): for k, v in tpl: if k == key: return v raise ValueError(repr(key)) _version = None def install(version): global _version _version = version def get_executables(version=None): if version is None: version = _version if version is None: raise TypeError("Invalid qemu version") return _get_matching_tuple(QEMU_BINARIES, version) def get_cpus(archicture, version=_version): if version is None: version = _version if version is None: raise TypeError("Invalid qemu version") cpus = _get_matching_tuple(QEMU_CPUS, version) return _get_matching_tuple(cpus, archicture) def get_machines(archicture, version=_version): if version is None: version = _version if version is None: raise TypeError("Invalid qemu version") machines = _get_matching_tuple(QEMU_MACHINES, version) return _get_matching_tuple(machines, archicture) class Version: _re_version = r"(?P\d{1,2}\.\d{1,2}(?:\.\d{1,2})?)" _re_package = r"(?: \((?P.*?)\))?" pattern = re.compile(r"^QEMU emulator version " + _re_version + _re_package + r", Copyright \(c\) 2003-2008 Fabrice Bellard$") def __init__(self, spec): self._spec = spec self._version = LooseVersion(spec) @classmethod def parse(cls, string): mtc = cls.pattern.match(string) if mtc is None: raise ValueError("invalid version string " + repr(string)) return cls(mtc.group("version")) def __cmp__(self, other): if isinstance(other, basestring): other = LooseVersion(other) return cmp(self._version, other._version) def __str__(self): return self._spec def __repr__(self): return repr(self._spec) def parse_and_install(string): version = Version.parse(string) last_compatible = None for supported in map(Version, QEMU_VERSIONS): if version < supported: break last_compatible = supported if last_compatible is None: raise ValueError("incompatible qemu version " + repr(version)) install(str(last_compatible)) virtualbricks-1.0.2/virtualbricks/router.py000066400000000000000000000025531262207653100211650ustar00rootroot00000000000000# Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from virtualbricks import bricks, settings class Router(bricks.Brick): type = "Router" class config_factory(bricks.Config): parameters = {"name": bricks.String("")} def __init__(self, factory, name): bricks.Brick.__init__(self, factory, name) self.config["name"] = name self.command_builder = {"-M": self.console, "-c": "configfile"} def get_parameters(self): return "Work in progress..." def prog(self): return settings.get("vdepath") + "/vde_router" def configured(self): return True virtualbricks-1.0.2/virtualbricks/scripts/000077500000000000000000000000001262207653100207555ustar00rootroot00000000000000virtualbricks-1.0.2/virtualbricks/scripts/__init__.py000066400000000000000000000000001262207653100230540ustar00rootroot00000000000000virtualbricks-1.0.2/virtualbricks/scripts/virtualbricks.py000066400000000000000000000021661262207653100242200ustar00rootroot00000000000000# Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. from __future__ import absolute_import from virtualbricks import app def make_application(config): from virtualbricks.gui import gui return gui.Application(config) def run(): from twisted.internet import gtk2reactor gtk2reactor.install() app.run_app(app.LockedApplication(make_application), app.Options()) virtualbricks-1.0.2/virtualbricks/settings.py000066400000000000000000000017511262207653100215040ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_settings -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import sys del sys.modules["virtualbricks.settings"] from virtualbricks import _settings _settings.install(_settings.Settings()) virtualbricks-1.0.2/virtualbricks/switches.py000066400000000000000000000104251262207653100214730ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_switches -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os from twisted.internet import defer from virtualbricks import settings, bricks, log, errors if False: # pyflakes _ = str sock_not_exists = log.Event("Socket does not exists: {path}") class SwitchConfig(bricks.Config): parameters = {"numports": bricks.SpinInt(32, 1, 128), "hub": bricks.Boolean(False), "fstp": bricks.Boolean(False)} class Switch(bricks.Brick): type = "Switch" ports_used = 0 config_factory = SwitchConfig def set_name(self, name): self._name = name for so in self.socks: so.nickname = name + "_port" so.path = os.path.join(settings.VIRTUALBRICKS_HOME, name + ".ctl") name = property(bricks.Brick.get_name, set_name) def __init__(self, factory, name): bricks.Brick.__init__(self, factory, name) self.command_builder = {"-x": "hub", # "-x": "hubmode", "-n": "numports", "-F": "fstp", "--macaddr": "macaddr", "-m": "mode", "-g": "group", "--priority": "priority", "--mgmtmode": "mgmtmode", "--mgmtgroup": "mgmtgroup", "-s": self.path, "-M": self.console} sock = factory.new_sock(self, self.name + "_port") sock.path = self.path() self.socks.append(sock) def get_parameters(self): fstp = "" hub = "" if self.config["fstp"]: fstp = ", FSTP" if self.config["hub"]: hub = ", HUB" return _("Ports: ") + "%d%s%s" % (self.config["numports"], fstp, hub) def prog(self): return settings.get("vdepath") + "/vde_switch" def configured(self): return self.socks[0].has_valid_path() # live-management callbacks def cbset_path(self, path): self.socks[0].path = path def cbset_fstp(self, arg=False): self.send("fstp/setfstp %d\n" % bool(arg)) def cbset_hub(self, arg=False): self.send("port/sethub %d\n" % bool(arg)) def cbset_numports(self, arg="32"): self.send("port/setnumports %s\n" % arg) class SwitchWrapperConfig(bricks.Config): parameters = {"path": bricks.String("")} class SwitchWrapper(bricks.Brick): type = "SwitchWrapper" pid = -1 config_factory = SwitchWrapperConfig def __init__(self, factory, name): bricks.Brick.__init__(self, factory, name) self.socks.append(factory.new_sock(self, self.name + "_port")) def poweron(self): if self.proc is not None: return defer.succeed(self) elif os.path.exists(self.config["path"]): self.proc = bricks.FakeProcess(self) return defer.succeed(self) else: self.logger.debug(sock_not_exists, path=self.config["path"]) msg = _("Socket does not exists: %s") % self.config["path"] return defer.fail(errors.BadConfigError(msg)) def poweroff(self, kill=False): self.proc = None return defer.succeed((self, None)) def get_parameters(self): return self.config["path"] def configured(self): return self.socks[0].has_valid_path() def cbset_path(self, path): self.socks[0].path = path virtualbricks-1.0.2/virtualbricks/tests/000077500000000000000000000000001262207653100204305ustar00rootroot00000000000000virtualbricks-1.0.2/virtualbricks/tests/__init__.py000066400000000000000000000205501262207653100225430ustar00rootroot00000000000000import os import sys import types import functools import difflib from twisted.trial import unittest from twisted.python import failure from virtualbricks import settings __builtins__["_"] = str TEST_THREADS = 0x01 TEST_DEPLOYMENT = 0x02 TEST_DATA_PATH = os.path.join(os.path.dirname(__file__), "data") def should_test_threads(): return int(os.environ.get("VIRTUALBRICKS_TESTS", 0)) & TEST_THREADS def should_test_deployment(): return int(os.environ.get("VIRTUALBRICKS_TESTS", 0)) & TEST_DEPLOYMENT def _id(obj): return obj def Skip(reason): # This decorator is camelcase because otherwise importing it cause all the # tests to skip because trial look deep in test method, class, module def decorator(test_item): if not isinstance(test_item, (type, types.ClassType)): @functools.wraps(test_item) def skip_wrapper(*args, **kwargs): raise unittest.SkipTest(reason) test_item = skip_wrapper test_item.skip = reason return test_item return decorator def skipIf(condition, reason): if condition: return Skip(reason) return _id def skipUnless(condition, reason): if not condition: return Skip(reason) return _id # from __future__ import (twisted.trail.unittest.TestCase.successResultOf, # twisted.trail.unittest.TestCase.failureResultOf) def successResultOf(self, deferred): """ Return the current success result of C{deferred} or raise C{self.failException}. @param deferred: A L{Deferred} which has a success result. This means L{Deferred.callback} or L{Deferred.errback} has been called on it and it has reached the end of its callback chain and the last callback or errback returned a non-L{failure.Failure}. @type deferred: L{Deferred} @raise SynchronousTestCase.failureException: If the L{Deferred} has no result or has a failure result. @return: The result of C{deferred}. """ result = [] deferred.addBoth(result.append) if not result: self.fail( "Success result expected on %r, found no result instead" % ( deferred,)) elif isinstance(result[0], failure.Failure): self.fail( "Success result expected on %r, " "found failure result instead:\n%s" % ( deferred, result[0].getTraceback())) else: return result[0] def failureResultOf(self, deferred, *expectedExceptionTypes): """ Return the current failure result of C{deferred} or raise C{self.failException}. @param deferred: A L{Deferred} which has a failure result. This means L{Deferred.callback} or L{Deferred.errback} has been called on it and it has reached the end of its callback chain and the last callback or errback raised an exception or returned a L{failure.Failure}. @type deferred: L{Deferred} @param expectedExceptionTypes: Exception types to expect - if provided, and the the exception wrapped by the failure result is not one of the types provided, then this test will fail. @raise SynchronousTestCase.failureException: If the L{Deferred} has no result, has a success result, or has an unexpected failure result. @return: The failure result of C{deferred}. @rtype: L{failure.Failure} """ result = [] deferred.addBoth(result.append) if not result: self.fail( "Failure result expected on %r, found no result instead" % ( deferred,)) elif not isinstance(result[0], failure.Failure): self.fail( "Failure result expected on %r, " "found success result (%r) instead" % (deferred, result[0])) elif (expectedExceptionTypes and not result[0].check(*expectedExceptionTypes)): expectedString = " or ".join([ '.'.join((t.__module__, t.__name__)) for t in expectedExceptionTypes]) self.fail( "Failure of type (%s) expected on %r, " "found type %r instead: %s" % ( expectedString, deferred, result[0].type, result[0].getTraceback())) else: return result[0] def restore_settings(olds): for k, v in olds.iteritems(): settings.set(k, v) def patch_settings(suite, **kwds): olds = dict((k, settings.get(k)) for k in kwds.iterkeys()) suite.addCleanup(restore_settings, olds) suite.patch(settings, "store", lambda: None) for k, v in kwds.iteritems(): settings.set(k, v) def pformat_tree(tree, sep="", indent=2): lst = [] n_cols = tree.get_n_columns() pformat_subtree(tree, tree.get_iter_root(), lst, n_cols, sep, indent, 0) return lst def pformat_subtree(tree, itr, lst, columns, sep="", indent=2, level=0): while itr: row = tree.get(itr, *range(columns)) lst.append("{0}{1}{2}".format(indent * level * " ", sep, row)) pformat_subtree(tree, tree.iter_children(itr), lst, columns, sep, indent, level + 1) itr = tree.iter_next(itr) class GtkTestCase(unittest.TestCase): def assert_tree_model_equal(self, tree1, tree2, msg=None): self.assertEqual(tree1.get_n_columns(), tree2.get_n_columns(), "Number of columns differs") for i in range(tree1.get_n_columns()): type1 = tree1.get_column_type(i) type2 = tree2.get_column_type(i) tmsg = "Invalid type for column {0}: {1}, {2}".format(i, type1, type2) self.assertEqual(type1, type2, tmsg) root1 = tree1.get_iter_root() root2 = tree2.get_iter_root() self.assert_subtree_model_equal(tree1, root1, tree2, root2, msg) def assert_subtree_model_equal(self, tree1, itr1, tree2, itr2, msg=None): if type(itr1) != type(itr2): self.fail_tree(tree1, tree2, msg) self.assertEqual(type(itr1), type(itr2)) while itr1 and itr2: if tuple(tree1[itr1]) != tuple(tree2[itr2]): self.fail_tree(tree1, tree2, msg) self.assertEqual(tuple(tree1[itr1]), tuple(tree2[itr2])) self.assert_subtree_model_equal(tree1, tree1.iter_children(itr1), tree2, tree2.iter_children(itr2)) itr1 = tree1.iter_next(itr1) itr2 = tree2.iter_next(itr2) def fail_tree(self, tree1, tree2, msg=None): if not msg: diff = "\n".join(difflib.ndiff(pformat_tree(tree1), pformat_tree(tree2))) msg = "Trees are different:\n" + diff self.fail(msg) def assert_visible(self, widget, msg=None): if not msg: msg = ("widget {0} is not visible when it is expected it " "is.".format(widget)) self.assertTrue(widget.get_visible(), msg) def assert_not_visible(self, widget, msg=None): if not msg: msg = ("widget {0} is visible when it is expected it is " "not.".format(widget)) self.assertFalse(widget.get_visible(), msg) class LoggingObserver: def __init__(self): self.msgs = [] def emit(self, event_dict): self.msgs.append(event_dict) def __call__(self, event_dict): self.emit(event_dict) def __len__(self): return len(self.msgs) def __getitem__(self, idx): try: return self.msgs[idx] except IndexError: raise IndexError("{0.__class__.__name__} index out of range" "".format(self)) except TypeError: raise TypeError("{0.__class__.__name__} indices must be integers, " "not {1.__class__.__name__}".format(self, idx)) def get_filename(resource): mod = sys.modules["virtualbricks.tests"] parts = resource.split("/") parts[0:0] = [os.path.dirname(mod.__file__), "data"] return os.path.join(*parts) virtualbricks-1.0.2/virtualbricks/tests/data/000077500000000000000000000000001262207653100213415ustar00rootroot00000000000000virtualbricks-1.0.2/virtualbricks/tests/data/qemu-img000077500000000000000000000005041262207653100230070ustar00rootroot00000000000000#!/bin/sh # This is a stub for qemu-img. Invoke it as following: # # $ qemu-img [create] [-b] [action] [-f] [format] name # # where the parameters between squares are ignored and name is used as # return code, tipically 0 or 1. if [ $# != 6 ]; then echo "Invalid arguments number" >&2 exit 1 else exit $6 fi virtualbricks-1.0.2/virtualbricks/tests/data/test.vbp000066400000000000000000000057731262207653100230450ustar00rootroot00000000000000ЏRR TSdR*)"EU"1( RTBaIb  0JR\Ked]@)JAٗ}Ǒh;sNݛo IBRa3 Q"EB"xuFA8:j >*[x)^T/}M&;ΰiN3lcZ \ibA'bG 44? SŃHO2C@q0?cXџȉLS im H?hł䟖@_,8y/6RMiTgɡysݜzNLkC?/JF4P8SGԝ8t/¬@Qx.,->pD&ylo՝&B[JgKQpJT'cPgӨ5}F?7B(Ħ7:P螴wǣ ,Ǣ0߲Pz*SbI1&S[p^mԑ;)ܤ7{tczѐoKgs|47r*Ȧ;yx#NH_4GW$NjP9,as 8 W7Fb3͞d1=;X יX,45X -Ld E{dLVKIy_404܄ ^R`yfdIULE7ojQˊZBT";XTuXE: ܋zl< ^p*K}U]wWQ}[{VtVUV2zH%!\5n*z:Z5Y̓V]l! #^iB#Eb`,gXbL,3vg#$.&ƪwQ % kیNf+ǝ̥컥8p1Y'bQ1+b^e}irBTD:oZw"Wg\Ӄ<חQsM265LdD!+W@rb\ЉwEV@R52TtE~G.!e1"+mI6*nJES5uV[ OCK17WɇH(Ch5ʲ;y[\I~F=s|^'"jݞh"J5xîUqnQqيҲRJPɓكlz֡C^dMӌ3hMI*J)]CyٱMz%ڹY;'ioЅj R0u[$ krՕkctY-zɍr8o, EDlycF B]^~~. j4dUWDEEXL@{ec}sMr0bB=BG{y~Z9J~yjl?q5(.QB6]WN&/нqptٽ9ch!I 4hu̴pֽtyh7~ss`l Kbо\}šiVUJ$# jj 2rrvvX|] B¬w]59Yjz wd>-cưB4w(Z__62?'???-R[ag۞'h#%XKM|Ҙku>++"_ݹsMR]xw~|HL hlh next -> extract -> step2 -> back -> step1 -> change archive -> next -> step 2 The user has changed the archive so delete the extracted project. """ self.dialog.set_project_name("test_delete") self.dialog.set_archive("/test_delete.vbp") self.humble.step_1(self.dialog, self.model, self.ipath, self.extract) self.assert_project_exists("test_delete") self.dialog.set_archive("/test.vbp") self.dialog.set_project_name("test") self.humble.step_1(self.dialog, self.model, self.ipath, self.extract) self.assert_project_does_not_exists("test_delete") def test_import_error(self): """If the import fails, destroy the assistant.""" extract = lambda *a: defer.fail(RuntimeError()) d = self.humble.step_1(self.dialog, self.model, self.ipath, extract) failureResultOf(self, d, RuntimeError) self.flushLoggedErrors(RuntimeError) self.assertTrue(self.dialog.destroied) def test_fill_model(self): """Found some image, fill the model set the page as complete.""" def extract(name, path): prj = self.manager.get_project(name) prj.create() # fake some image fp = filepath.FilePath(prj.path).child(".images") fp.makedirs() fp.child("debian7.img").touch() fp.child("ubuntu.img").touch() self.extract_args = (name, path) return defer.succeed(prj) successResultOf(self, self.humble.step_1(self.dialog, self.model, self.ipath, extract)) model = gtk.ListStore(str, object, bool) model.append(("debian7.img", self.ipath.child("debian7.img"), True)) model.append(("ubuntu.img", self.ipath.child("ubuntu.img"), True)) self.assert_tree_model_equal(self.model, model) # class TestHumbleImportStep2(TestHumbleImport): # page = 2 # def setUp(self): # TestHumbleImport.setUp(self) # self.model = gtk.ListStore(str, object, bool) # self.ipath = self.manager.project_path("vimages") # # self.dialog.project = self.project = self.manager.create("test") # # self.dialog.images = {} # def test_step_2_commit_page(self): # """No images are extracted, go to the next page.""" # self.humble.step_2(self.dialog, self.model, self.ipath) # self.assert_page_commit() # self.assert_current_page(3) # class TestHumbleImportStep3(TestHumbleImport): # page = 3 # def setUp(self): # TestHumbleImport.setUp(self) # self.dialog.images = {} # self.store1 = gtk.ListStore(str, object, bool) # self.store2 = gtk.ListStore(str, object) # def test_no_images(self): # """ # If the project does not require any image it should be importable. # """ # self.assertEqual(len(self.dialog.images), 0) # self.humble.step_3(self.dialog, self.store1, self.store2) # self.assert_page_complete(3) # def test_simple(self): # """ # The archive does not include images and the project uses one. The # assistant is stopped to this step. # """ # self.dialog.images["test_image"] = "/vimages/test.img" # self.humble.step_3(self.dialog, self.store1, self.store2) # self.assert_page_not_complete(3) # def test_one_image_mapped(self): # """The archive include one image used by the project.""" # self.dialog.images["test_image"] = "" # self.store1.append(("test_image", "/vimages/test.img", True)) # self.humble.step_3(self.dialog, self.store1, self.store2) # self.assert_page_complete(3) # def test_one_image_not_mapped(self): # """The project require one image but is not mapped.""" # self.dialog.images["test_image"] = "" # self.humble.step_3(self.dialog, self.store1, self.store2) # self.assert_page_not_complete(3) # class TestHumbleImportStep4(TestHumbleImport): # page = 4 # def setUp(self): # TestHumbleImport.setUp(self) # self.dialog.images = {} # self.store1 = gtk.ListStore(str, object, bool) # self.store2 = gtk.ListStore(str, object) # self.dialog.project = self.project = self.manager.create("test") # def test_no_come_back(self): # """Step 4 does not permit to come back.""" # self.humble.step_4(self.dialog, self.store1, self.store2) # self.assert_page_commit() # def make_src_dest(self, *names): # source = filepath.FilePath(self.mktemp()) # source.makedirs() # dest = filepath.FilePath(self.mktemp()) # dest.makedirs() # ret = [source, dest] # for name in names: # src = source.child(name) # src.touch() # dst = dest.child(name) # ret.extend((src, dst)) # return ret # def test_save_images(self): # """Move the selected images.""" # NAME1, NAME2 = "image1", "image2" # src, _, _, dimg1, _, dimg2 = self.make_src_dest(NAME1, NAME2) # self.store1.append((NAME1, dimg1, True)) # self.store1.append((NAME2, dimg2, False)) # d = self.humble.save_images(self.store1, src) # self.assertEqual(d, {NAME1: dimg1}) # def test_remap_images(self): # """Remap the images """ class AssistantStub: def __init__(self): self.completed = {} self.current_page = 0 self.pages = [] def get_nth_page(self, num): try: return self.pages[num] except IndexError: return None def get_current_page(self): return self.current_page def set_page_complete(self, page, complete): self.completed[page] = complete class ImportDialog(dialogs.ImportDialog): assistant = None class TestImportDialog(unittest.TestCase): def setUp(self): self.factory = stubs.FactoryStub() self.dialog = ImportDialog(self.factory) self.dialog.assistant = self.assistant = AssistantStub() def assert_page_complete(self, page, msg=None): if not msg: msg = "Page is not set as completed." self.assertIn(page, self.assistant.completed, msg) self.assertTrue(self.assistant.completed[page], msg) def test_set_page_complete(self): page = object() self.assistant.pages = [page] self.dialog.set_page_complete() self.assert_page_complete(page) virtualbricks-1.0.2/virtualbricks/tests/test_events.py000066400000000000000000000040041262207653100233430ustar00rootroot00000000000000from twisted.trial import unittest from twisted.internet import defer from virtualbricks import events, errors from virtualbricks.tests import stubs, Skip if False: # pyflakes _ = str class TestEvents(unittest.TestCase): def setUp(self): self.factory = stubs.FactoryStub() self.event = events.Event(self.factory, "test_event") def test_base(self): self.assertFalse(self.event.configured()) self.assertEqual(self.event.get_state(), _("unconfigured")) self.event.config["actions"] = "add boo" self.event.config["delay"] = 1 self.assertEqual(self.event.get_state(), _("off")) self.event.scheduled = True self.assertEqual(self.event.get_state(), _("running")) def test_change_state(self): self.assertRaises(errors.BadConfigError, self.event.toggle) self.event.config["actions"].append("") self.event.config["delay"] = 1024 self.event.toggle() self.assertIsNot(self.event.scheduled, None) self.event.toggle() self.assertIs(self.event.scheduled, None) def test_get_parameters(self): self.event.config["actions"].append("do cucu") self.event.config["delay"] = 1024 self.assertEqual(self.event.get_parameters(), 'Delay: 1024; Actions: "do cucu"') self.event.config["actions"].append("undo cucu") self.assertEqual(self.event.get_parameters(), 'Delay: 1024; Actions: "do cucu", "undo cucu"') @Skip("Use clock facilities") def test_poweron(self): self.assertRaises(errors.BadConfigError, self.event.poweron) self.event.config["actions"].append("") self.event.config["delay"] = 0.00001 return self.event.poweron() def test_poweron2(self): self.event.config["actions"].append("") self.event.config["delay"] = 100 self.event.poweron() s = self.event.scheduled self.event.poweron() self.assertIs(self.event.scheduled, s) self.event.poweroff() virtualbricks-1.0.2/virtualbricks/tests/test_factory.py000066400000000000000000000042731262207653100235160ustar00rootroot00000000000000from twisted.trial import unittest from virtualbricks.tools import is_running from virtualbricks.tests import stubs, successResultOf from virtualbricks.errors import BrickRunningError class TestFactory(unittest.TestCase): def test_reset(self): factory = stubs.Factory() factory.new_brick("stub", "test_brick") factory.reset() self.assertEquals(factory.bricks, []) def test_new_brick(self): factory = stubs.Factory() NAME = "test_brick" TYPE = "Stub" brick = factory.new_brick("stub", NAME) self.assertEqual(brick.get_type(), TYPE) self.assertEqual(brick.get_name(), NAME) def test_new_event(self): factory = stubs.Factory() NAME = "test_event" event = factory.new_event(NAME) self.assertEqual(event.get_type(), "Event") self.assertEqual(event.get_name(), NAME) def test_dup_event(self): factory = stubs.Factory() event = factory.new_event("test_event") copy = factory.dup_event(event) self.assertIsNot(copy, event) self.assertIsNot(copy.config, event.config) self.assertEqual(copy.config, event.config) def test_dup_brick(self): factory = stubs.Factory() switch = factory.new_brick("switch", "switch") switch2 = factory.dup_brick(switch) self.assertIsNot(switch, switch2) self.assertIsNot(switch.config, switch2.config) self.assertEqual(switch.config, switch2.config) def test_del_brick(self): """Delete a brick from a factory.""" factory = stubs.Factory() brick = factory.new_brick("stub", "test_brick") self.assertEqual(factory.bricks, [brick]) factory.del_brick(brick) self.assertEqual(factory.bricks, []) def test_del_running_brick(self): """If the brick is running, it cannot be removed.""" factory = stubs.Factory() brick = factory.new_brick("_stub", "test_brick") self.assertEqual(brick, successResultOf(self, brick.poweron())) self.assertRaises(BrickRunningError, factory.del_brick, brick) self.assertEqual(factory.bricks, [brick]) self.assertTrue(is_running(brick)) virtualbricks-1.0.2/virtualbricks/tests/test_graphics.py000066400000000000000000000015221262207653100236410ustar00rootroot00000000000000import os from virtualbricks.tests import unittest, stubs from virtualbricks.gui import graphics import virtualbricks.gui GUI_PATH = os.path.dirname(virtualbricks.gui.__file__) class TestGraphics(unittest.TestCase): def setUp(self): self.factory = stubs.FactoryStub() self.brick = stubs.BrickStub(self.factory, "Test") def test_get_filename(self): filename = graphics.get_filename("virtualbricks.gui", "data/test") self.assertTrue(filename.endswith("virtualbricks/gui/data/test")) def test_get_data_filename(self): filename = graphics.get_data_filename("randompath") self.assertTrue(filename.endswith("virtualbricks/gui/data/randompath")) def test_brick_icon(self): self.assertEqual(graphics.brick_icon(self.brick), GUI_PATH + "/data/stub.png") virtualbricks-1.0.2/virtualbricks/tests/test_gui.py000066400000000000000000000263021262207653100226300ustar00rootroot00000000000000from twisted.trial import unittest import gtk from virtualbricks import project, _settings from virtualbricks.gui import gui, interfaces from virtualbricks.tests import stubs class WidgetStub: sensitive = True tooltip = "" def __init__(self): self.signals = {} def get_sensitive(self): return self.sensitive def set_sensitive(self, sensitive): self.sensitive = sensitive def get_tooltip_markup(self): return self.tooltip def set_tooltip_markup(self, tooltip): self.tooltip = tooltip def connect(self, signal, callback, *args): self.signals.setdefault(signal, []).append((callback, args)) class CheckButtonStub(WidgetStub): active = False def __init__(self): WidgetStub.__init__(self) self.signals["toggled"] = [] def get_active(self): return self.active def set_active(self, active): self.active, active = active, self.active if self.active ^ active: for callback, args in self.signals["toggled"]: callback(self, *args) class TestStateFramework(unittest.TestCase): def test_prerequisite(self): """ A prerequisite return YES, NO or MAYBE. YES and MAYBE are considered both true in the ultimate stage. """ for b, ret in (True, gui.YES), (False, gui.NO), (True, gui.MAYBE): pre = gui.CompoundPrerequisite(lambda: ret) if b: self.assertTrue(pre()) else: self.assertFalse(pre()) def test_yes_prerequisite(self): """ Prerequisite can be more than one, if YES or NO is returned then the other prerequisites are not checked. """ def prerequisite(): l.append(True) for check, ret in (False, gui.NO), (True, gui.YES): l = [] pre = gui.CompoundPrerequisite(lambda: ret, prerequisite) if check: self.assertTrue(pre()) else: self.assertFalse(pre()) self.assertEqual(l, []) def test_nested_prerequisite(self): """Prerequisite can be nested.""" def prerequisite1(): l[0] = 1 def prerequisite2(): l[1] = 1 l = [0, 0] pre1 = gui.CompoundPrerequisite(lambda: gui.MAYBE, prerequisite1) pre2 = gui.CompoundPrerequisite(lambda: gui.YES, prerequisite2) pre = gui.CompoundPrerequisite(pre1, pre2) self.assertTrue(pre()) self.assertEqual(l, [1, 0]) def test_state(self): """ The state object control other objects based on the prerequisites. """ class Control: def react(self, status): self.status = status state = gui.State() state.add_prerequisite(lambda: True) control = Control() state.add_control(control) state.check() self.assertTrue(control.status) def test_checkbutton_state(self): """Test a checkbutton that controls another widgets.""" TOOLTIP = "Disabled" manager = gui.StateManager() checkbutton = CheckButtonStub() widget = WidgetStub() self.assertTrue(widget.sensitive) self.assertEqual(widget.tooltip, "") manager.add_checkbutton_active(checkbutton, TOOLTIP, widget) self.assertFalse(widget.sensitive) self.assertEqual(widget.tooltip, TOOLTIP) def test_checkbutton_nonactive(self): """Enable a widget if the checkbutton is not active.""" TOOLTIP = "Disabled" manager = gui.StateManager() checkbutton = CheckButtonStub() widget = WidgetStub() self.assertTrue(widget.sensitive) self.assertEqual(widget.tooltip, "") manager.add_checkbutton_not_active(checkbutton, TOOLTIP, widget) self.assertTrue(widget.sensitive) self.assertEqual(widget.tooltip, "") checkbutton.set_active(True) self.assertFalse(widget.sensitive) self.assertEqual(widget.tooltip, TOOLTIP) class Readme(gui.ReadmeMixin, gui._Root): def __init__(self, manager): self.textview = gtk.TextView() self.manager = manager def set_text(self, text): self.textview.get_buffer().set_text(text) def get_object(self, name): if name == "readme_textview": return self.textview def init(self, factory): super(Readme, self).init(factory) def on_quit(self): super(Readme, self).on_quit() class TestReadme(unittest.TestCase): def test_quit(self): DESC = "test" PROJECT = "test_project" factory = stubs.Factory() manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(PROJECT) prj.create() prj.open(factory, _settings.Settings(self.mktemp())) readme_tab = Readme(manager) readme_tab.init(factory) readme_tab.set_text(DESC) self.assertEqual(prj.get_description(), "") readme_tab.on_quit() self.assertEqual(prj.get_description(), DESC) class DumbGui: def __init__(self, factory): self.brickfactory = factory class TestController(unittest.TestCase): def setUp(self): self.factory = stubs.Factory() self.gui = DumbGui(self.factory) self.brick = self.get_brick() self.controller = interfaces.IConfigController(self.brick) def get_brick(self): raise NotImplementedError() def get_object(self, name): return self.controller.get_object(name) def configure_brick(self): self.controller.configure_brick(self.gui) def get_config_view(self): self.controller.get_config_view(self.gui) def _assert_active_equal(self, name, status): self.assertEqual(self.controller.get_object(name).get_active(), status) def assert_active(self, name): self._assert_active_equal(name, True) def assert_not_active(self, name): self._assert_active_equal(name, False) def assert_spinbutton_value(self, name, value): self.assertEqual(self.controller.get_object(name).get_value_as_int(), value) def assert_parameter_equal(self, name, value): self.assertEqual(self.brick.get(name), value) def assert_parameters_equal(self, names=(), values=(), **kwds): for name, value in zip(names, values): self.assert_parameter_equal(name, value) for name, value in kwds.iteritems(): self.assert_parameter_equal(name, value) def assert_text_equal(self, name, text): self.assertEqual(self.controller.get_object(name).get_text(), text) class TestSwitchController(TestController): def get_brick(self): from virtualbricks.switches import Switch return Switch(self.factory, "test") def test_view(self): """The initial status of the switch controller.""" self.brick.set({"fstp": False, "hub": False, "numports": 2}) self.get_config_view() self.assert_not_active("fstp_checkbutton") self.assert_not_active("hub_checkbutton") self.assert_spinbutton_value("ports_spinbutton", 2) def test_config(self): """Set the switch parameters.""" self.assert_parameters_equal(("fstp", "hub", "numports"), (False, False, 32)) self.get_object("fstp_checkbutton").set_active(True) self.get_object("hub_checkbutton").set_active(False) self.get_object("ports_spinbutton").set_value(31) self.configure_brick() self.assert_parameters_equal(("fstp", "hub", "numports"), (True, False, 31)) class TestSwitchWrapperController(TestController): PATH = "/foo/bar" def get_brick(self): from virtualbricks.switches import SwitchWrapper return SwitchWrapper(self.factory, "test") def test_view(self): """The initial status of the switch wrapper.""" self.brick.set({"path": self.PATH}) self.get_config_view() self.assert_text_equal("entry", self.PATH) def test_config(self): """Set the switch wrapper parameters.""" self.assert_parameter_equal("path", "") self.get_object("entry").set_text(self.PATH) self.configure_brick() self.assert_parameter_equal("path", self.PATH) class TestTapController(TestController): def get_brick(self): from virtualbricks.tuntaps import Tap return Tap(self.factory, "test") def test_view(self): """The initial status of the tap.""" cfg = {"ip": "0.0.0.0", "nm": "0.0.0.0", "gw": "0.0.0.0", "mode": "dhcp"} self.brick.set(cfg) self.get_config_view() self.assert_text_equal("ip_entry", "0.0.0.0") self.assert_text_equal("nm_entry", "0.0.0.0") self.assert_text_equal("gw_entry", "0.0.0.0") self.assert_not_active("nocfg_radiobutton") self.assert_active("dhcp_radiobutton") self.assert_active("manual_radiobutton") test_view.todo = "Implement test utility for the plugmixin" def assert_initial(self): """Assert initial status.""" self.assert_parameters_equal(ip="10.0.0.1", nm="255.255.255.0", gw="", mode="off") def test_config_nocfg(self): """Set the tap parameters for no network configuration.""" self.assert_initial() self.get_object("nocfg_radiobutton").set_active(True) self.configure_brick() self.assert_parameters_equal(ip="10.0.0.1", nm="255.255.255.0", gw="", mode="off") def test_config_dhcp(self): """Set the tap parameters for dhcp.""" self.assert_initial() self.get_object("dhcp_radiobutton").set_active(True) self.configure_brick() self.assert_parameters_equal(ip="10.0.0.1", nm="255.255.255.0", gw="", mode="dhcp") def test_config_manual(self): """Set the tap parameters for dhcp.""" IP = "192.168.1.1" NM = "255.255.0.0" GW = "192.168.179.1" self.assert_initial() self.get_object("manual_radiobutton").set_active(True) self.get_object("ip_entry").set_text(IP) self.get_object("nm_entry").set_text(NM) self.get_object("gw_entry").set_text(GW) self.configure_brick() self.assert_parameters_equal(ip=IP, nm=NM, gw=GW, mode="manual") class TestCaptureController(TestController): def get_brick(self): from virtualbricks.tuntaps import Capture return Capture(self.factory, "test") def test_view(self): """The initial status of the capture interface.""" self.get_config_view() test_view.todo = "Implement test utility for the plugmixin" def test_config(self): """Set the capture interface parameters.""" self.assert_parameter_equal("iface", "") self.fail("TODO") test_config.todo = "Implement test utility for the plugmixin" virtualbricks-1.0.2/virtualbricks/tests/test_link.py000066400000000000000000000071651262207653100230070ustar00rootroot00000000000000from twisted.trial import unittest from twisted.python import log from twisted.internet import defer from virtualbricks import link, errors, settings from virtualbricks.tests import stubs class TestPlug(unittest.TestCase): plug_factory = link.Plug sock_factory = link.Sock def setUp(self): self.factory = stubs.FactoryStub() self.brick = stubs.BrickStub(self.factory, "test") self.plug = self.plug_factory(self.brick) self.log = [] log.addObserver(self.log.append) self.addCleanup(log.removeObserver, self.log.append) def test_connected(self): result = [] self.plug.connected().addErrback(result.append) self.assertEqual(len(result), 1) result[0].trap(errors.NotConnectedError) def test_connected_erroronloop(self): self.plug._antiloop = True settings.set("erroronloop", False) result = [] self.plug.connected().addErrback(result.append) self.assertEqual(len(result), 1) result[0].trap(errors.LinkLoopError) self.assertEqual(0, len(self.log)) self.plug._antiloop = True settings.set("erroronloop", True) self.plug.connected().addErrback(result.append) self.assertEqual(len(result), 2) result[1].trap(errors.LinkLoopError) self.assertEqual(1, len(self.log)) self.plug.connected().addErrback(result.append) self.assertEqual(len(result), 3) result[2].trap(errors.NotConnectedError) self.assertEqual(1, len(self.log)) def test_connected_poweron(self): self.brick.poweron = lambda: defer.succeed(self.brick) sock = self.sock_factory(self.brick) self.plug.connect(sock) result = [] self.plug.connected().addCallback(result.append) self.assertEqual(result, [self.brick]) self.assertFalse(self.plug._antiloop) def test_connect(self): self.assertFalse(self.plug.configured()) if __debug__: self.assertRaises(AssertionError, self.plug.disconnect) self.assertFalse(self.plug.configured()) if __debug__: self.assertRaises(AssertionError, self.plug.connect, None) self.assertFalse(self.plug.configured()) sock = self.sock_factory(self.brick) self.plug.connect(sock) self.assertIs(self.plug.sock, sock) self.assertTrue(self.plug.configured()) self.plug.disconnect() self.assertFalse(self.plug.configured()) def test_disconnect(self): """ Test that after a disconnect there are no more references to plug. """ sock = self.sock_factory(self.brick) self.plug.connect(sock) self.plug.disconnect() self.assertEqual(sock.plugs, []) class TestSock(unittest.TestCase): plug_factory = link.Plug sock_factory = link.Sock def setUp(self): self.factory = stubs.FactoryStub() self.brick = stubs.BrickStub(self.factory, "test") self.sock = self.sock_factory(self.brick) # @unittest.skip("test outdated") # def test_free_ports(self): # # socks works only with switches? # self.assertRaises(AttributeError, self.sock.get_free_ports) # self.brick.cfg["numports"] = 32 # self.assertEqual(self.sock.get_free_ports(), 32) # plug = self.plug_factory(self.brick) # plug.connect(self.sock) # self.assertEqual(self.sock.get_free_ports(), 31) def test_has_valid_path(self): filename = self.mktemp() with open(filename, "w"): pass self.sock.path = filename self.assertTrue(self.sock.has_valid_path()) virtualbricks-1.0.2/virtualbricks/tests/test_log.py000066400000000000000000000110501262207653100226170ustar00rootroot00000000000000import logging from twisted.trial import unittest from twisted.python import log as legacylog from virtualbricks import log logger = log.Logger() test_event = log.Event("This is a test event") test_event_2 = log.Event("This is another test event") class Observer: def __init__(self): self.events = [] def __call__(self, event): self.events.append(event) class EventCmp: def __init__(self, event): self.event = event def __eq__(self, other): if isinstance(other, dict): return self.event.is_(other) return NotImplemented def __ne__(self, other): return not self.__eq__(other) def install_observer(test_case): observer = Observer() logger.publisher.addObserver(observer) test_case.addCleanup(logger.publisher.removeObserver, observer) return observer class TestLog(unittest.TestCase): def setUp(self): self.observer = install_observer(self) def test_log(self): """Send a simple event.""" logger.info(test_event) self.assertEqual(self.observer.events, [EventCmp(test_event)]) def test_tap(self): """Collect only specific events. Here test_event_2 is not collected.""" observer = Observer() self.addCleanup(test_event.tap(observer, logger.publisher)) logger.info(test_event) logger.info(test_event_2) self.assertEqual(observer.events, [EventCmp(test_event)]) def test_info_event_attrs(self): """ Test the attributes of an event of level LogLevel.INFO. The LegacyLogObserver add some extra attributes to the event... """ logger.info(test_event) self.assertEqual(self.observer.events, [EventCmp(test_event)]) self.assertEqual(sorted(self.observer.events[0].keys()), ["format", "logLevel", "log_format", "log_id", "log_legacy", "log_level", "log_logger", "log_namespace", "log_source", "log_time"]) def test_filter_event(self): """Events can be filtered.""" logger.publisher.levels.setLogLevelForNamespace( "virtualbricks.tests.test_log", log.LogLevel.warn) self.addCleanup(logger.publisher.levels.clearLogLevels) logger.info(test_event) self.assertEqual(len(self.observer.events), 0) def test_legacy_emitter(self): """Test the events logged with the legacy logger are not lost.""" observer = log.LegacyAdapter() legacylog.addObserver(observer) self.addCleanup(legacylog.removeObserver, observer) legacylog.msg("test") legacylog.err(RuntimeError("error")) err = self.flushLoggedErrors(RuntimeError) self.assertEqual(len(self.observer.events), 2) self.assertEqual(len(err), 1) def test_legacy_observer(self): """ If a message is emitted by the new logging machinery, a legacy observer does not miss it. """ observer = Observer() legacylog.addObserver(observer) self.addCleanup(legacylog.removeObserver, observer) logger.info(test_event) self.assertEqual(observer.events, [EventCmp(test_event)]) def test_legacy_observer_ignore_debug(self): """ By default all debug messages are filtered by the legacy observer. """ observer = Observer() legacylog.addObserver(observer) self.addCleanup(legacylog.removeObserver, observer) logger.debug(test_event) self.assertEqual(observer.events, []) class TestStdLogging(unittest.TestCase): """Test the integration with the standard logging module.""" def setUp(self): self.observer = install_observer(self) root = logging.getLogger() handler = log.StdLoggingAdapter() root.addHandler(handler) self.addCleanup(root.removeHandler, handler) def test_std_logging_adapter(self): """Install and handler to the std's root logger.""" try: raise RuntimeError("test") except: logging.exception("exp") self.flushLoggedErrors(RuntimeError) self.assertEqual(len(self.observer.events), 1) self.assertEqual(self.observer.events[0]["log_format"].split("\n")[0], "exp") def test_event_has_log_id(self): """ Test if events logged with the standard logging library have the 'log_id' attribute. """ logging.warn("test") self.assertEqual(len(self.observer.events), 1) self.assertIn("log_id", self.observer.events[0]) virtualbricks-1.0.2/virtualbricks/tests/test_project.py000066400000000000000000000347651262207653100235260ustar00rootroot00000000000000import StringIO import operator from twisted.trial import unittest from twisted.python.filepath import FilePath from twisted.internet import defer from virtualbricks import errors, project from virtualbricks._settings import Settings from virtualbricks.tests import get_filename, failureResultOf, stubs from virtualbricks.tests.stubs import Factory NAME = "test_project" class TestProjectManager(unittest.TestCase): def test_path_exists(self): """ All the projects are in path defined at contruction time. Assert that that path exists. """ manager = project.ProjectManager(self.mktemp()) self.assertTrue(FilePath(manager.path).exists()) def test_exists_bizarre_name(self): manager = project.ProjectManager(self.mktemp()) self.assertRaises(errors.InvalidNameError, manager.get_project, "test/bizarre") def test_import_project_exists(self): """ Import a project but a project with the same name already exists. """ manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) prj.create() d = manager.import_prj(NAME, "/example/test.vbp") failureResultOf(self, d, errors.ProjectExistsError) def test_import(self): """Import a project.""" def _assert(prj): self.assertTrue(prj.exists()) self.assertEquals(prj.name, NAME) manager = project.ProjectManager(self.mktemp()) return manager.import_prj(NAME, get_filename("test.vbp")) def test_iter(self): """ Iterating througt the manager returns the projects. The order is arbitrary. """ NAME1 = "prj1" NAME2 = "prj2" manager = project.ProjectManager(self.mktemp()) prj1 = manager.get_project(NAME1) prj1.create() prj2 = manager.get_project(NAME2) prj2.create() self.assertEqual(sorted(manager, key=lambda p: p.name), [prj1, prj2]) def test_iter2(self): """Returns only prooved projects.""" path = self.mktemp() manager = project.ProjectManager(path) # a file is not a project FilePath(path).child("child1").touch() prj = manager.get_project(NAME) prj.create() # a directory without a .project file is not a project FilePath(path).child("prj2").makedirs() self.assertEqual(list(manager), [prj]) def test_get_project_invalid_name(self): """Name could not contains path traversal.""" manager = project.ProjectManager(self.mktemp()) self.assertRaises(errors.InvalidNameError, manager.get_project, "../ciccio") def test_restore_last_project(self): """Restore last used project.""" manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) prj.create() settings = Settings(self.mktemp()) settings.set("current_project", NAME) self.assertEqual(manager.restore_last(Factory(), settings), prj) def test_restore_last_project_not_exists(self): """ If the last project does not exists, don't create a new one with the same name but use a default name. """ settings = Settings(self.mktemp()) settings.set("current_project", NAME) manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) self.assertFalse(prj.exists()) prj = manager.restore_last(Factory(), settings) self.assertEqual(prj.name, settings.DEFAULT_PROJECT + "_0") class TestProject(unittest.TestCase): def test_equality(self): """ Two projects are equal if they have the same name and the same path. """ manager = project.ProjectManager(self.mktemp()) prj1 = manager.get_project(NAME) prj2 = manager.get_project(NAME) self.assertEqual(prj1, prj2) def test_delete(self): """Delete a project.""" manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) prj.create() self.assertTrue(prj.exists()) prj.delete() self.assertFalse(prj.exists()) def test_open(self): """Open a project.""" manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) prj.create() prj.open(Factory(), Settings(self.mktemp())) def test_open_project_does_not_exists(self): """Try to open a project that does not exists.""" manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) self.assertRaises(errors.ProjectNotExistsError, prj.open, Factory()) def test_open_project_set_virtualbricks_home(self): """ Every time a project is opened, settings.VIRTUALBRICKS_HOME is set to the project's path. """ manager = project.ProjectManager(self.mktemp()) settings = Settings(self.mktemp()) prj = manager.get_project(NAME) prj.create() self.assertEqual(settings.VIRTUALBRICKS_HOME, settings.DEFAULT_HOME) prj.open(Factory(), settings) self.assertEqual(prj.path, settings.VIRTUALBRICKS_HOME) self.assertNotEqual(settings.VIRTUALBRICKS_HOME, settings.DEFAULT_HOME) def test_save(self): """Save a project.""" class ProjectCmp: def __init__(self, prj): self.data = prj._project.getContent() def __eq__(self, other): return not self.__ne__(other) def __ne__(self, other): return self.data != ProjectCmp(other).data manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) prj.create() cmparator = ProjectCmp(prj) factory = Factory() factory.new_brick("vm", "test") prj.save(factory) self.assertNotEqual(cmparator, prj) def test_save_after_delete(self): manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) prj.create() prj.delete() prj.save(Factory()) self.assertTrue(prj.exists()) def test_save_as(self): """Create a copy of the project with a different name.""" NEW_PROJET_NAME = "copy" manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) prj.create() new = prj.save_as(NEW_PROJET_NAME, Factory()) self.assertTrue(FilePath(new.path).exists()) self.assertNotEqual(prj.path, new.path) def test_rename(self): """Rename a project.""" NEWNAME = "rename_test" manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) prj.create() self.assertTrue(prj.exists()) old_path = prj.path prj.rename(NEWNAME, False, Settings(self.mktemp())) self.assertEqual(prj.name, NEWNAME) self.assertTrue(prj.exists()) self.assertNotEqual(prj.path, old_path) self.assertFalse(FilePath(old_path).exists()) def test_rename_invalid(self): """If an invalid name is given an exception is raised.""" manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) prj.create() self.assertRaises(errors.InvalidNameError, prj.rename, "test/invalid") def test_rename_invalid_pathological(self): """If the name is really strange, the error is not raised.""" manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) prj.create() prj.rename("test/../invalid", False, Settings(self.mktemp())) self.assertEqual(prj.name, "invalid") def test_rename_exists(self): """If a project with the same name exists an exception is raised.""" NEWNAME = "test2" manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) prj.create() manager.get_project(NEWNAME).create() self.assertRaises(errors.ProjectExistsError, prj.rename, NEWNAME) def test_description(self): """Return a description of brand new project.""" manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) self.assertEqual(prj.get_description(), "") def test_set_description(self): """Set the description of a project.""" DESCRIPTION = "hello world" manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) prj.set_description(DESCRIPTION) self.assertEqual(prj.get_description(), DESCRIPTION) def test_save_description(self): """Save the description when the project is saved.""" DESCRIPTION = "hello world" manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) prj.set_description(DESCRIPTION) readme = FilePath(prj.path).child("README") self.assertFalse(readme.exists()) prj.save(Factory()) self.assertEqual(readme.getContent(), DESCRIPTION) def test_files(self): manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) prj.create() files = [FilePath(prj.path).child(".project")] self.assertEqual(list(prj.files()), files) afile = FilePath(prj.path).child("file") afile.open("w").close() files.append(afile) self.assertEqual(sorted(prj.files()), sorted(files)) def test_exists(self): """Test if a project with certain name exists.""" manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) self.assertFalse(prj.exists()) prj.create(NAME) self.assertTrue(prj.exists()) def test_create(self): """Create a new project.""" manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) prj.create() self.assertTrue(prj.exists()) def test_create_already_exists(self): """ Create a new project but a project with the same name already exists. """ manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) prj.create() self.assertTrue(prj.exists()) self.assertRaises(errors.ProjectExistsError, prj.create) prj.create(overwrite=True) def test_close(self): """A project cannot be closed if one or more bricks are running.""" factory = stubs.Factory() brick = factory.new_brick("_stub", "test") brick.poweron() manager = project.ProjectManager(self.mktemp()) prj = manager.get_project(NAME) self.assertRaises(errors.BrickRunningError, prj.close, factory) class TestTarArchive(unittest.TestCase): def setUp(self): from virtualbricks import settings self.tmp = self.mktemp() self.patch(settings, "VIRTUALBRICKS_HOME", self.tmp) def run_process(self, exe, args, environ): self.exe = exe self.args = args self.environ = environ return defer.Deferred() def test_create(self): """Create a simple archive.""" archive = project.BsdTgz() archive.create("test.tgz", ["a", "b"], run=self.run_process) self.assertEqual(self.args, ["cfzh", "test.tgz", "-C", self.tmp, "a", "b"]) def test_create_images(self): """Create an archive with images.""" tmp = FilePath(self.mktemp()) tmp.makedirs() a = tmp.child("a") a.touch() b = tmp.child("b") b.touch() files = ["a", "b"] images = [("img_a", a.path), ("img_b", b.path)] archive = project.BsdTgz() archive.create("test.tgz", files, images, self.run_process) expected = ["cfzh", "test.tgz", "-C", self.tmp, "a", "b", ".images/img_a", ".images/img_b"] self.assertEqual(self.args, expected) PROJECT = """[Image:test_qcow2.qcow2] path = /images/test qcow2.qcow2 [Image:vtatpa.martin.qcow2] path = /images/vtatpa.martin.qcow2 [Qemu:test] hda = vtatpa.martin.qcow2 name = test privatehda = * snapshot = * use_virtio = * link|sender|sw1|rtl8139|00:11:22:33:44:55 """ class PseudoOrderedDict(dict): def __init__(self, arg): super(PseudoOrderedDict, self).__init__(arg) self._order = map(operator.itemgetter(0), arg) def __iter__(self): return iter(self._order) class TestProjectEntry(unittest.TestCase): def setUp(self): fp = StringIO.StringIO(PROJECT) self.entry = project.ProjectEntry.from_fileobj(fp) def test_get_images(self): self.assertEqual(self.entry.get_images(), [(('Image', 'test_qcow2.qcow2'), {'path': '/images/test qcow2.qcow2'}), (('Image', 'vtatpa.martin.qcow2'), {'path': '/images/vtatpa.martin.qcow2'})]) def test_get_virtualmachines(self): self.assertEqual(self.entry.get_virtualmachines(), [(("Qemu", "test"), {"hda": "vtatpa.martin.qcow2", "name": "test", "privatehda": "*", "snapshot": "*", "use_virtio": "*"})]) def test_get_disks(self): self.assertEqual(self.entry.get_disks(), {"test": [("hda", "vtatpa.martin.qcow2")]}) def test_device_for_image_empty(self): devs = list(self.entry.device_for_image("test_qcow2.qcow2")) self.assertEqual([], devs) def test_device_for_image(self): devs = list(self.entry.device_for_image("vtatpa.martin.qcow2")) self.assertEqual([("test", "hda")], devs) def test_dump(self): sections = { ("Image", "test_qcow2.qcow2"): { "path": "/images/test qcow2.qcow2" }, ("Image", "vtatpa.martin.qcow2"): { "path": "/images/vtatpa.martin.qcow2" }, ("Qemu", "test"): PseudoOrderedDict([ ("hda", "vtatpa.martin.qcow2"), ("name", "test"), ("privatehda", "*"), ("snapshot", "*"), ("use_virtio", "*"), ]), } links = [("link", "sender", "sw1", "rtl8139", "00:11:22:33:44:55")] sio = StringIO.StringIO() project.ProjectEntry(sections, links).dump(sio) self.assertEquals(sio.getvalue(), PROJECT) virtualbricks-1.0.2/virtualbricks/tests/test_settings.py000066400000000000000000000037431262207653100237100ustar00rootroot00000000000000import os from virtualbricks import _settings from virtualbricks.tests import unittest class TestSettings(unittest.TestCase): def test_create_settings_if_not_exists(self): """ If the settings file does not exist, create it with reasonable values. """ filename = self.mktemp() self.assertFalse(os.path.isfile(filename)) s = _settings.Settings(filename) s.load() self.assertTrue(os.path.isfile(filename)) OLD_CONFIG_FILE = """ [Main] alt-term = /usr/bin/gnome-terminal term = /usr/bin/xterm baseimages = /home/user/.virtualbricks femaleplugs = False vdepath = /usr/bin kqemu = False python = True current_project = /home/user/.virtualbricks/.virtualbricks.vbl sudo = /usr/bin/gksu erroronloop = False qemupath = /usr/bin kvm = True cdroms = ksm = False systray = True bricksdirectory = /home/kapo/.virtualbricks projects = 1 """ class TestNewSettingsV1(unittest.TestCase): """ Test the compatibility with the old settings format. All these tests are relative to the virtualbricks 1.0 settings file format. """ def setUp(self): self.filename = self.mktemp() with open(self.filename, "w") as fp: fp.write(OLD_CONFIG_FILE) def test_cowfmt(self): """ cowfmt is a new option, don't raise an exception if it is not found. """ s = _settings.Settings(self.filename) s.load() self.assertEqual(s.get("cowfmt"), "qcow2") def test_workspace(self): """ workspace is a new option, don't raise an exception if it is not found. """ s = _settings.Settings(self.filename) s.load() self.assertEqual(s.get("workspace"), _settings.DEFAULT_WORKSPACE) def test_show_missing(self): """ show_missing is a new option, don't raise an exception if it is not found. """ s = _settings.Settings(self.filename) s.load() self.assertEqual(s.get("show_missing"), True) virtualbricks-1.0.2/virtualbricks/tests/test_switches.py000066400000000000000000000050101262207653100236660ustar00rootroot00000000000000import os from virtualbricks import switches, errors, settings from virtualbricks.tests import unittest, stubs class TestSwitch(unittest.TestCase): def test_socks(self): factory = stubs.FactoryStub() sw = switches.Switch(factory, "test_switch") self.assertEqual(len(sw.socks), 1) self.assertIn(sw.socks[0], factory.socks) def test_base(self): sw = switches.Switch(stubs.FactoryStub(), "test_switch") self.assertEqual(len(sw.socks), 1) self.assertEqual(sw.socks[0].path, sw.path()) self.assertIs(sw.proc, None) def test_live_management_callbacks(self): sw = switches.Switch(stubs.FactoryStub(), "test_switch") output = [] sw.send = output.append sw.set({"numports": 33}) self.assertEqual(len(output), 1) self.assertEqual(output[0], "port/setnumports 33\n") sw.config["numports"] = 33 self.assertEqual(len(output), 1) def test_args(self): sw1 = switches.Switch(stubs.FactoryStub(), "test_switch") self.assertEqual(sw1.args(), ["/usr/bin/vde_switch", "-M", os.path.join(settings.VIRTUALBRICKS_HOME, "test_switch.mgmt"), "-n", "32", "-s", os.path.join(settings.VIRTUALBRICKS_HOME, "test_switch.ctl")]) class TestSwitchWrapper(unittest.TestCase): def setUp(self): self.factory = stubs.FactoryStub() self.sw = switches.SwitchWrapper(self.factory, "test_switch") def test_socks(self): self.assertEqual(len(self.sw.socks), 1) self.assertIn(self.sw.socks[0], self.factory.socks) def test_poweron(self): """ SwitchWrapper uses a custom poweron method, assure that it respect the interface. """ self.sw.proc = object() result = [] self.sw.poweron().addCallbacks(result.append) self.assertEqual(result, [self.sw]) self.sw.proc = None sockfile = self.mktemp() open(sockfile, "w").close() self.sw.config["path"] = sockfile self.sw.poweron().addCallback(result.append) self.assertEqual(result, [self.sw] * 2) self.sw.proc = None self.sw.config["path"] = "" deferred = self.sw.poweron() self.assertFailure(deferred, errors.BadConfigError) def test_poweroff(self): self.sw.proc = object() result = [] self.sw.poweroff().addCallback(result.append) self.assertIs(self.sw.proc, None) self.assertEqual(result, [(self.sw, None)]) virtualbricks-1.0.2/virtualbricks/tests/test_tools.py000066400000000000000000000054001262207653100232000ustar00rootroot00000000000000import os import os.path import struct import StringIO from virtualbricks import tools from virtualbricks.tests import unittest class MockLock(object): def __init__(self): self.c = 0 def __enter__(self): self.c += 1 def __exit__(self, exc_type, exc_value, traceback): pass HELLO = "/hello/backingfile" COW_HEADER = "OOOM\x00\x00\x00\x02" + HELLO + "\x00" * 1006 QCOW_HEADER = "QFI\xfb\x00\x00\x00\x01" + struct.pack(">Q", 20) + \ struct.pack(">I", len(HELLO)) + HELLO QCOW_HEADER0 = "QFI\xfb\x00\x00\x00\x01" + "\x00" * 12 QCOW_HEADER2 = "QFI\xfb\x00\x00\x00\x02" + struct.pack(">Q", 20) + \ struct.pack(">I", len(HELLO)) + HELLO UNKNOWN_HEADER = "MOOO\x00\x00\x00\x02" class TestTools(unittest.TestCase): def test_sincronize_with(self): lock = MockLock() foo_s = tools.synchronize_with(lock)(lambda: None) foo_s() self.assertEqual(lock.c, 1) foo_s() self.assertEqual(lock.c, 2) def test_tempfile_context(self): with tools.Tempfile() as (fd, filename): os.close(fd) self.assertTrue(os.path.isfile(filename)) try: with tools.Tempfile() as (fd, filename): os.close(fd) raise RuntimeError except RuntimeError: self.assertFalse(os.path.isfile(filename)) def test_backing_file_from_cow(self): sio = StringIO.StringIO(COW_HEADER[8:]) backing_file = tools.get_backing_file_from_cow(sio) self.assertEqual(backing_file, HELLO) def test_backing_file_from_qcow0(self): sio = StringIO.StringIO(QCOW_HEADER0[8:]) backing_file = tools.get_backing_file_from_qcow(sio) self.assertEqual(backing_file, "") def test_backing_file_from_qcow(self): sio = StringIO.StringIO(QCOW_HEADER) sio.seek(8) backing_file = tools.get_backing_file_from_qcow(sio) self.assertEqual(backing_file, HELLO) def test_backing_file(self): for header in COW_HEADER, QCOW_HEADER, QCOW_HEADER2: sio = StringIO.StringIO(header) backing_file = tools.get_backing_file(sio) self.assertEqual(backing_file, "/hello/backingfile") sio = StringIO.StringIO(UNKNOWN_HEADER) self.assertRaises(tools.UnknowTypeError, tools.get_backing_file, sio) def test_fmtsize(self): """Basic fmtusage.""" self.assertEqual("1023 B", tools.fmtsize(1023)) self.assertEqual("5120 B", tools.fmtsize(5 * 1024)) self.assertEqual("9216 B", tools.fmtsize(9 * 1024)) self.assertEqual("123.0 MB", tools.fmtsize(123 * 1024 ** 2)) self.assertEqual("10.0 GB", tools.fmtsize(10200 * 1024 ** 2)) self.assertEqual("321.0 GB", tools.fmtsize(321 * 1024 ** 3)) virtualbricks-1.0.2/virtualbricks/tests/test_virtualmachines.py000066400000000000000000000334211262207653100252420ustar00rootroot00000000000000import os.path import errno import copy import StringIO from twisted.trial import unittest from twisted.internet import defer from virtualbricks import (link, virtualmachines as vm, errors, settings, configfile, tools) from virtualbricks.tests import (stubs, test_link, successResultOf, failureResultOf, TEST_DATA_PATH) def disks(vm): return (vm.config.__getitem__(d) for d in ("hda", "hdb", "hdc", "hdd", "fda", "fdb", "mtdblock")) ARGS = ["true", "-m", "64", "-smp", "1", "@@DRIVESARGS@@", "-name", "vm", "-net", "none", "-mon", "chardev=mon", "-chardev", "socket,id=mon,path=/home/marco/.virtualbricks/vm.mgmt,server,nowait", "-mon", "chardev=mon_cons", "-chardev", "stdio,id=mon_cons,signal=off"] class _Image(vm.Image): def __init__(self): self.acquired = [] self.released = [] def acquire(self, disk): self.acquired.append(disk) def release(self, disk): self.released.append(disk) class TestVirtualMachine(unittest.TestCase): def setUp(self): self.factory = stubs.FactoryStub() self.vm = stubs.VirtualMachineStub(self.factory, "vm") self.image_path = os.path.abspath(self.mktemp()) self.image = vm.Image("test", self.image_path) self.vm.get("hda").set_image(self.image) def get_args(self, *drive_args): args = ARGS[:] i = args.index("@@DRIVESARGS@@") args[i:i + 1] = drive_args return args def test_args(self): args = self.get_args("-hda", self.image_path) self.assertEquals(successResultOf(self, self.vm.args()), args) def test_args_virtio(self): self.vm.set({"use_virtio": True}) drv = "file={0},if=virtio".format(self.image_path) args = self.get_args("-drive", drv) self.assertEquals(successResultOf(self, self.vm.args()), args) def test_add_plug_hostonly(self): mac, model = object(), object() plug = self.vm.add_plug(vm.hostonly_sock, mac, model) self.assertEqual(plug.mode, "vde") self.assertEqual(len(self.vm.plugs), 1) self.assertIs(plug.sock, vm.hostonly_sock) self.assertIs(plug.mac, mac) self.assertIs(plug.model, model) def test_add_plug_sock(self): brick = stubs.BrickStub(self.factory, "test") sock = vm.VMSock(self.factory.new_sock(brick)) plug = self.vm.add_plug(sock) self.assertEqual(plug.mode, "vde") self.assertEqual(len(self.vm.plugs), 1) self.assertIs(plug.sock, sock) self.assertEqual(len(sock.plugs), 1) # self.assertIs(sock.plugs[0], plug) def test_add_sock(self): mac, model = object(), object() sock = self.vm.add_sock(mac, model) self.assertEqual(self.vm.socks, [sock]) self.assertIs(sock.mac, mac) self.assertIs(sock.model, model) self.assertEqual(self.factory.socks, [sock.original]) def test_get_disk_args(self): disk = DiskStub(self.vm, "hda") self.vm.config["hda"] = disk def test_del_brick(self): factory = stubs.FactoryStub() vm = factory.new_brick("vm", "test") sock = vm.add_sock() self.assertEqual(factory.socks, [sock.original]) factory.del_brick(vm) self.assertEqual(factory.socks, []) def test_brick_plug_sock_self(self): """A plug can be connected to a sock of the same brick.""" sock = self.vm.add_sock() plug = self.vm.add_plug(sock) self.assertEqual(self.vm.socks, [sock]) self.assertEqual(self.vm.plugs, [plug]) self.assertIs(plug.sock, sock) self.assertIs(plug.brick, sock.brick) def test_poweron_loop_on_self_plug(self): """If a vm is plugged to itself it can start without error. The last check seem obvious but poweron() deferred is called only there is no errors.""" self.vm._poweron = lambda _: defer.succeed(None) self.vm.add_plug(self.vm.add_sock()) d = self.vm.poweron() d.callback(self.vm) self.assertEqual(successResultOf(self, d), self.vm) def test_lock(self): self.vm.acquire() self.vm.release() image = vm.Image("test", "/vmimage") disk = DiskStub(self.vm, "hdb") disk.set_image(image) disk.acquire() self.vm.config["hda"].set_image(image) self.assertRaises(errors.LockedImageError, self.vm.acquire) _image = _Image() self.vm.config["hdb"].set_image(_image) try: self.vm.acquire() except errors.LockedImageError: pass else: self.fail("vm lock acquired but it should not happend") self.assertEqual(_image.acquired, _image.released) class TestVMPlug(test_link.TestPlug): @staticmethod def sock_factory(brick): return vm.VMSock(link.Sock(brick)) @staticmethod def plug_factory(brick): return vm.VMPlug(link.Plug(brick)) class TestVMSock(test_link.TestSock): @staticmethod def plug_factory(brick): return vm.VMPlug(link.Plug(brick)) @staticmethod def sock_factory(brick): return vm.VMSock(link.Sock(brick)) def test_has_valid_path2(self): factory = stubs.FactoryStub() vm = stubs.VirtualMachineStub(factory, "vm") sock = vm.add_sock() self.assertTrue(sock.has_valid_path()) HOSTONLY_CONFIG = """[Qemu:vm] name=vm link|vm|_hostonly|rtl8139|00:11:22:33:44:55 """ class TestPlugWithHostOnlySock(unittest.TestCase): def setUp(self): self.factory = stubs.FactoryStub() self.vm = self.factory.new_brick("vm", "vm") self.plug = self.vm.add_plug(vm.hostonly_sock, "00:11:22:33:44:55") def test_add_plug(self): self.assertIs(self.plug.sock, vm.hostonly_sock) def test_poweron(self): self.vm._poweron = lambda _: defer.succeed(self.vm) d = self.vm.poweron() d.callback(self.vm) def test_config_save(self): sio = StringIO.StringIO() configfile.ConfigFile().save_to(self.factory, sio) self.assertEqual(sio.getvalue(), HOSTONLY_CONFIG) def test_config_resume(self): self.factory.del_brick(self.vm) self.assertEqual(len(self.factory.bricks), 0) sio = StringIO.StringIO(HOSTONLY_CONFIG) configfile.ConfigFile().restore_from(self.factory, sio) self.assertEqual(len(self.factory.bricks), 1) vm1 = self.factory.get_brick_by_name("vm") self.assertEqual(len(vm1.plugs), 1) plug = vm1.plugs[0] self.assertEqual(plug.mac, "00:11:22:33:44:55") self.assertIs(plug.sock, vm.hostonly_sock) class ImageStub: path = "cucu" class NULL: def __eq__(self, other): return self is other def __ne__(self, other): return self is not other class FULL: def __eq__(self, other): return True def __ne__(self, other): return False class DiskStub(vm.Disk): _basefolder = None sync_cmd = "false" def get_basefolder(self): if self._basefolder is not None: return self._basefolder return self.VM.get_basefolder() def set_basefolder(self, value): self._basefolder = value basefolder = property(get_basefolder, set_basefolder) class Object: pass class TestDisk(unittest.TestCase): def setUp(self): self.factory = stubs.FactoryStub() self.vm = stubs.VirtualMachineStub(self.factory, "test_vm") self.disk = DiskStub(self.vm, "hda") def test_create_cow(self): settings.set("qemupath", "/supercali") failureResultOf(self, self.disk._create_cow("name"), errors.BadConfigError) settings.set("qemupath", TEST_DATA_PATH) self.disk.image = ImageStub() def cb(ret): self.fail("cow created, callback called with %s" % ret) def eb(failure): failure.trap(RuntimeError) return self.disk._create_cow("1").addCallbacks(cb, eb) def test_sync_err(self): def cb(ret): self.fail("_create_cow did not failed while it had to") def eb(failure): failure.trap(RuntimeError) failure.value.args[0].startswith("sync failed") return self.disk._sync(("", "", 0)).addCallbacks(cb, eb) def test_check_base(self): err = self.assertRaises(IOError, self.disk._check_base, "/montypython") self.assertEqual(err.errno, errno.ENOENT) self.patch(tools, "get_backing_file", lambda _: NULL()) self.disk._create_cow = lambda _: defer.succeed(None) self.disk.image = ImageStub() cowname = self.mktemp() fp = open(cowname, "w") fp.close() result = [] self.disk._check_base(cowname).addCallback(result.append) self.assertEqual(result, [cowname]) self.patch(tools, "get_backing_file", lambda _: FULL()) del result[:] cowname = self.mktemp() fp = open(cowname, "w") fp.close() self.disk._check_base(cowname).addCallback(result.append) self.assertEqual(result, [cowname]) def test_get_cow_name(self): self.disk.basefolder = "/nonono/" err = self.assertRaises(OSError, self.disk._get_cow_name) self.assertEqual(err.errno, errno.EACCES) self.disk.basefolder = basefolder = self.mktemp() self.disk._check_base = lambda passthru: defer.succeed(passthru) def cb(cowname): self.assertTrue(os.path.exists(basefolder)) self.assertEqual(cowname, os.path.join(basefolder, "%s_%s.cow" % (self.disk.VM.name, self.disk.device))) return self.disk._get_cow_name().addCallback(cb) def test_get_cow_name_create_cow(self): def throw(_errno): def _check_base(_): raise IOError(_errno, os.strerror(_errno)) return _check_base self.disk.basefolder = basefolder = self.mktemp() cowname = os.path.join(basefolder, "%s_%s.cow" % (self.disk.VM.name, self.disk.device)) self.disk._check_base = throw(errno.EACCES) self.disk._create_cow = lambda passthru: defer.succeed(passthru) err = self.assertRaises(IOError, self.disk._get_cow_name) self.assertEqual(err.errno, errno.EACCES) self.disk._check_base = throw(errno.ENOENT) result = [] self.disk._get_cow_name().addCallback(result.append) self.assertEqual(result, [cowname]) def test_args(self): # XXX: Temporary pass this test but rework disk.args() self.assertIs(self.disk.image, None) self.disk.get_real_disk_name = lambda: defer.succeed("test") self.assertEqual(successResultOf(self, self.disk.args()), []) # self.assertEqual(successResultOf(self, self.disk.args()), # ["-hda", "test"]) # f = failure.Failure(RuntimeError()) # self.disk.get_real_disk_name = lambda: defer.fail(f) # failureResultOf(self, self.disk.args(), RuntimeError) def test_get_real_disk_name(self): def raise_IOError(): raise IOError(-1) result = successResultOf(self, self.disk.get_real_disk_name()) self.assertEqual(result, "") self.disk.image = Object() self.disk.image.path = "ping" result = successResultOf(self, self.disk.get_real_disk_name()) self.assertEqual(result, "ping") self.disk._get_cow_name = raise_IOError self.vm.config["private" + self.disk.device] = True failureResultOf(self, self.disk.get_real_disk_name(), IOError) def test_deepcopy(self): disk = copy.deepcopy(self.disk) self.assertIsNot(disk, self.disk) self.assertIs(disk.image, None) image = self.factory.new_disk_image("test", "/cucu") self.disk.set_image(image) disk = copy.deepcopy(self.disk) self.assertIsNot(disk, self.disk) self.assertIsNot(disk.image, None) self.assertIs(disk.image, image) def test_acquire(self): self.assertFalse(self.disk.cow) self.assertIs(self.disk.image, None) self.assertFalse(self.vm.config["snapshot"]) self.disk.acquire() image = vm.Image("test", "/vmimage") self.vm.set({"snapshot": False, "privatehda": False}) self.disk.set_image(image) self.disk.acquire() self.assertIs(image.master, self.disk) disk = DiskStub(self.vm, "hdb") disk.set_image(image) self.assertRaises(errors.LockedImageError, disk.acquire) def test_release(self): self.assertFalse(self.disk.cow) self.assertIs(self.disk.image, None) self.assertFalse(self.vm.config["snapshot"]) self.disk.release() image = vm.Image("test", "/vmimage") self.vm.set({"snapshot": False, "privatehda": False}) self.disk.set_image(image) self.disk.acquire() self.disk.release() class TestImage(unittest.TestCase): def test_acquire(self): image = vm.Image("test", "/vmimage") o = object() image.acquire(o) self.assertIs(image.master, o) exc = self.assertRaises(errors.LockedImageError, image.acquire, object()) self.assertEqual(exc.args, (image, o)) image.acquire(o) def test_release(self): image = vm.Image("test", "/vmimage") exc = self.assertRaises(errors.LockedImageError, image.release, object()) self.assertEqual(exc.args, (image, None)) image.release(None) o = object() image.acquire(o) image.release(o) self.assertRaises(errors.LockedImageError, image.release, o) virtualbricks-1.0.2/virtualbricks/tests/test_wires.py000066400000000000000000000061011262207653100231700ustar00rootroot00000000000000try: import mock except ImportError: mock = None from twisted.trial import unittest from virtualbricks import wires, link, settings from virtualbricks.tests import stubs class TestNetemu(unittest.TestCase): def setUp(self): self.factory = stubs.FactoryStub() self.netemu = wires.Netemu(self.factory, "test_netemu") def test_args(self): """Test that the brick is started with the desired arguments.""" cfg = {"bandwidthsymm": False, "bandwidth": 125000, "bandwidthr": 126000, "delaysymm": True, "delay": 10, "delayr": 20, "chanbufsizesymm": True, "chanbufsize": 75000, "chanbufsizer": 75000, "losssymm": False, "loss": 100, "lossr": 0} self.netemu.set(cfg) sock1 = link.Sock(None, "sock1") self.netemu.connect(sock1) sock2 = link.Sock(None, "sock2") self.netemu.connect(sock2) args = ["vde-netemu", "-v", "sock1:sock2", "-b", "LR 125000", "-b", "RL 126000", "-d", "10", "-c", "75000", "-l", "LR 100", "-l", "RL 0", "-M", "{0}/test_netemu.mgmt".format(settings.VIRTUALBRICKS_HOME), "--nofifo"] self.assertEqual(self.netemu.args(), args) def test_live_management(self): """ If set a *sync parameter, the corrisponding left-to-right and right to left callbacks must not be called. """ config = { "delaysymm": False, "delay": 1, "delayr": 2 } self.netemu.config["delaysymm"] = True self.assertEqual(self.netemu.config["delay"], 0) self.assertEqual(self.netemu.config["delayr"], 0) self.netemu.cbset_delay = mock.Mock(name="cbset_delay") self.netemu.cbset_delayr = mock.Mock(name="cbset_delayr") self.netemu.set(config) self.netemu.cbset_delay.assert_called_once_with(1) self.netemu.cbset_delayr.assert_called_once_with(2) if mock is None: test_live_management.skip = "Mock library not installed" def test_live_management_2(self): """Same as precedent but symmetric.""" config = { "delaysymm": True, "delay": 1, "delayr": 2 } self.netemu.config["delaysymm"] = False self.assertEqual(self.netemu.config["delay"], 0) self.assertEqual(self.netemu.config["delayr"], 0) self.netemu.cbset_delay = mock.Mock(name="cbset_delay", side_effect=self.netemu.cbset_delay) self.netemu.cbset_delayr = mock.Mock(name="cbset_delayr", side_effect=self.netemu.cbset_delayr) self.netemu.send = mock.Mock(name="send") self.netemu.set(config) self.netemu.cbset_delay.assert_called_once_with(1) self.netemu.cbset_delayr.assert_called_once_with(2) self.netemu.send.assert_called_once_with("delay 1\n") if mock is None: test_live_management_2.skip = "Mock library not installed" virtualbricks-1.0.2/virtualbricks/tests/true_pid.py000066400000000000000000000006071262207653100226200ustar00rootroot00000000000000import os import sys import time if __name__ == "__main__": pidfile = None i = 0 for i in range(1, len(sys.argv)): if sys.argv[i] == "-P": pidfile = sys.argv[i+1] i += 2 break print sys.argv, pidfile, i if pidfile: with open(pidfile, "w") as fp: fp.write(str(os.getpid())) time.sleep(int(sys.argv[i])) virtualbricks-1.0.2/virtualbricks/tools.py000066400000000000000000000246441262207653100210120ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_tools -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import sys import errno import random import re import functools import tempfile import struct from virtualbricks import log from twisted.internet import utils from twisted.python import constants logger = log.Logger() ksm_error = log.Event("Can not change ksm state. (failed command: {cmd})") def random_mac(): random.seed() return "00:aa:{0:02x}:{1:02x}:{2:02x}:{3:02x}".format( random.getrandbits(8), random.getrandbits(8), random.getrandbits(8), random.getrandbits(8)) RandMac = random_mac MAC_RE = re.compile(r"^([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$") def mac_is_valid(mac): return bool(MAC_RE.match(mac)) def synchronize(func, lock): @functools.wraps(func) def wrapper(*args, **kwds): with lock: return func(*args, **kwds) return wrapper def synchronize_with(lock): def wrap(func): return synchronize(func, lock) return wrap def stack_trace(): out = [] f = sys._getframe(1) while f: out.append("{0.f_code.co_filename}:{0.f_lineno}".format(f)) f = f.f_back return "\n".join(out) def check_missing(path, files): return [f for f in files if not os.access(os.path.join(path, f), os.X_OK)] vde_bins = ["vde_switch", "vde_plug", "vde_cryptcab", "dpipe", "vdeterm", "vde_plug2tap", "wirefilter", "vde_router"] qemu_bins = ["qemu", "kvm", "qemu-system-arm", "qemu-system-cris", "qemu-system-i386", "qemu-system-m68k", "qemu-system-microblaze", "qemu-system-mips", "qemu-system-mips64", "qemu-system-mips64el", "qemu-system-mipsel", "qemu-system-ppc", "qemu-system-ppc64", "qemu-system-ppcemb", "qemu-system-sh4", "qemu-system-sh4eb", "qemu-system-sparc", "qemu-system-sparc64", "qemu-system-x86_64", "qemu-img"] def check_missing_vde(path): return check_missing(path, vde_bins) def check_missing_qemu(path): missing = check_missing(path, qemu_bins) return missing, sorted(set(qemu_bins) - set(missing)) def check_kvm(path): if not os.access(os.path.join(path, "kvm"), os.X_OK): return False if not os.access("/sys/class/misc/kvm", os.X_OK): return False return True def check_ksm(): try: with open("/sys/kernel/mm/ksm/run") as fp: return bool(int(fp.readline())) except IOError: return False def _check_cb(exit_code, cmd): if exit_code: # exit state != 0 logger.error(ksm_error, cmd=cmd) def enable_ksm(enable, sudo): if enable ^ check_ksm(): cmd = "echo {0:d} > /sys/kernel/mm/ksm/run".format(enable) if sudo: d = utils.getProcessValue(sudo, ["--", "su", "-c", cmd], env=os.environ) else: d = utils.getProcessValue(os.environ.get("SHELL", "/bin/sh"), ["-c", cmd], env=os.environ) d.addCallback(_check_cb, cmd) class Tempfile: def __enter__(self): self.fd, self.filename = tempfile.mkstemp() return self.fd, self.filename def __exit__(self, exc_type, exc_value, traceback): try: os.remove(self.filename) except OSError, e: if e.errno != errno.ENOENT: raise GENERIC_HEADER_FMT = ">II" _L = struct.calcsize(GENERIC_HEADER_FMT) COW_MAGIC = 0x4f4f4f4d # OOOM COW_SIZE = 1024 QCOW_MAGIC = 0x514649fb # \xfbIFQ QCOW_HEADER_FMT = ">QI" COWD_MAGIC = 0x44574f43 # COWD VMDK_MAGIC = 0x564d444b # KDMV QED_MAGIC = 0x00444551 # \0DEQ VDI_HEADER_FMT = "<64cI" VDI_SIGNATURE = 0xbeda107f _VDI_L = struct.calcsize(VDI_HEADER_FMT) VPC_HEADER_FMT = "<8c" VPC_CREATOR = "conectix" _VPC_L = struct.calcsize(VPC_HEADER_FMT) CLOOP_MAGIC = """#!/bin/sh #V2.0 Format modprobe cloop file=$0 && mount -r -t iso9660 /dev/cloop $1 """ CLOOP_HEADER_FMT = "{0}c".format(len(CLOOP_MAGIC)) _CLOOP_L = struct.calcsize(CLOOP_HEADER_FMT) _MAX_HEADER = max(_L, _VDI_L, _VPC_L, _CLOOP_L) def get_backing_file_from_cow(fp): data = fp.read(COW_SIZE) return data.rstrip("\x00") def get_backing_file_from_qcow(fp): offset, size = struct.unpack(QCOW_HEADER_FMT, fp.read(12)) if size == 0: return "" else: fp.seek(offset) return fp.read(size) class UnknowTypeError(Exception): pass def get_backing_file(fp): data = fp.read(8) magic, version = struct.unpack(GENERIC_HEADER_FMT, data) if magic == COW_MAGIC: return get_backing_file_from_cow(fp) elif magic == QCOW_MAGIC and version in (1, 2, 3): return get_backing_file_from_qcow(fp) raise UnknowTypeError() def backing_files_for(files): for file in files: try: with open(file) as fp: yield get_backing_file(fp) except UnknowTypeError: pass def fmtsize(size): if size < 10240: return "{0} B".format(size) size /= 1024.0 for unit in "KB", "MB", "GB": if size < 1024: return "{0:.1f} {1}".format(size, unit) size /= 1024.0 return "{0:.1f} TB".format(size) def copyTo(self, destination, followLinks=True): """ Copies self to destination. If self doesn't exist, an OSError is raised. If self is a directory, this method copies its children (but not itself) recursively to destination - if destination does not exist as a directory, this method creates it. If destination is a file, an IOError will be raised. If self is a file, this method copies it to destination. If destination is a file, this method overwrites it. If destination is a directory, an IOError will be raised. If self is a link (and followLinks is False), self will be copied over as a new symlink with the same target as returned by os.readlink. That means that if it is absolute, both the old and new symlink will link to the same thing. If it's relative, then perhaps not (and it's also possible that this relative link will be broken). File/directory permissions and ownership will NOT be copied over. If followLinks is True, symlinks are followed so that they're treated as their targets. In other words, if self is a link, the link's target will be copied. If destination is a link, self will be copied to the destination's target (the actual destination will be destination's target). Symlinks under self (if self is a directory) will be followed and its target's children be copied recursively. If followLinks is False, symlinks will be copied over as symlinks. @param destination: the destination (a FilePath) to which self should be copied @param followLinks: whether symlinks in self should be treated as links or as their targets """ if self.islink() and not followLinks: os.symlink(os.readlink(self.path), destination.path) return # XXX TODO: *thorough* audit and documentation of the exact desired # semantics of this code. Right now the behavior of existent # destination symlinks is convenient, and quite possibly correct, but # its security properties need to be explained. if self.isdir(): if not destination.exists(): destination.createDirectory() for child in self.children(): destChild = destination.child(child.basename()) copyTo(child, destChild, followLinks) elif self.isfile(): writefile = destination.open('w') try: readfile = self.open() try: while 1: # XXX TODO: optionally use os.open, os.read and O_DIRECT # and use os.fstatvfs to determine chunk sizes and make # *****sure**** copy is page-atomic; the following is # good enough for 99.9% of everybody and won't take a # week to audit though. chunk = readfile.read(self._chunkSize) writefile.write(chunk) if len(chunk) < self._chunkSize: break finally: readfile.close() finally: writefile.close() elif not self.exists(): raise OSError(errno.ENOENT, "No such file or directory") class DummyDict(dict): __slots__ = ["value"] def __init__(self, value): self.value = value def __getitem__(self, name): return self.value class ImageFormat(constants.Names): RAW = constants.NamedConstant() QCOW2 = constants.NamedConstant() QED = constants.NamedConstant() QCOW = constants.NamedConstant() COW = constants.NamedConstant() VDI = constants.NamedConstant() VMDK = constants.NamedConstant() VPC = constants.NamedConstant() CLOOP = constants.NamedConstant() UNKNOWN = constants.NamedConstant() _type_map = { COW_MAGIC: {1: ImageFormat.COW}, QCOW_MAGIC: {1: ImageFormat.QCOW, 2: ImageFormat.QCOW2}, COWD_MAGIC: {1: ImageFormat.VMDK}, VMDK_MAGIC: {1: ImageFormat.VMDK}, QED_MAGIC: DummyDict(ImageFormat.QED) } def image_type(data): magic, version = struct.unpack(GENERIC_HEADER_FMT, data[:_L]) try: return _type_map[magic][version] except KeyError: pass _, signature = struct.unpack(VDI_HEADER_FMT, data[:_VDI_L]) if signature == VDI_SIGNATURE: return ImageFormat.VDI if struct.unpack(VPC_HEADER_FMT, data[:_VPC_L]) == VPC_CREATOR: return ImageFormat.VPC if struct.unpack(CLOOP_HEADER_FMT, data[:_CLOOP_L]) == CLOOP_MAGIC: return ImageFormat.CLOOP return ImageFormat.UNKNOWN def image_type_from_file(filename): with open(filename) as fp: return image_type(fp.read(_MAX_HEADER)) def dispose(obj): obj.__dispose__() def is_running(brick): return brick.__isrunning__() virtualbricks-1.0.2/virtualbricks/tunnels.py000066400000000000000000000074251262207653100213400ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_tunnels -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os from virtualbricks import settings, bricks, link, log logger = log.Logger() pwdgen_exit = log.Event("Command pwdgen exited with {code}") if False: # pyflakes _ = str class TunnelListenConfig(bricks.Config): parameters = {"password": bricks.String(""), "port": bricks.SpinInt(7667, 1, 65535)} class TunnelListen(bricks.Brick): type = "TunnelListen" config_factory = TunnelListenConfig command_builder = {"-s": None, "#password": "password", "-p": "port"} def __init__(self, factory, name): bricks.Brick.__init__(self, factory, name) self.command_builder["-s"] = self.sock_path self.plugs.append(link.Plug(self)) def sock_path(self): if self.configured(): return self.plugs[0].sock.path.rstrip('[]') return "" def get_parameters(self): if self.plugs[0].sock: return _("plugged to") + " " + self.plugs[0].sock.brick.name + \ " " + _("listening to udp:") + " " + \ self.config.get("port") return _("disconnected") def prog(self): return os.path.join(settings.get("vdepath"), "vde_cryptcab") def configured(self): return bool(self.plugs[0].sock) def args(self): # TODO: port to utils.getProcessOutput pwdgen = "echo %s | sha1sum >/tmp/tunnel_%s.key && sync" % ( self.config["password"], self.name) exitstatus = os.system(pwdgen) logger.info(pwdgen_exit, code=exitstatus) res = [] res.append(self.prog()) res.append("-P") res.append("/tmp/tunnel_%s.key" % self.name) for arg in self.build_cmd_line(): res.append(arg) return res #def post_poweroff(self): # os.unlink("/tmp/tunnel_%s.key" % self.name) # pass class TunnelConnectConfig(TunnelListenConfig): parameters = {"host": bricks.String(""), "localport": bricks.SpinInt(10771, 1, 65535)} class TunnelConnect(TunnelListen): type = "TunnelConnect" config_factory = TunnelConnectConfig command_builder = {"-s": None, "#password": "password", "-p": "localport", "-c": None, "#port": "port"} def __init__(self, factory, name): TunnelListen.__init__(self, factory, name) self.command_builder["-c"] = self.get_host def get_host(self): if self.config["host"]: return "{0}:{1}".format(self.config["host"], self.config["port"]) return "" def get_parameters(self): if self.plugs[0].sock: return _("plugged to") + " " + self.plugs[0].sock.brick.name +\ _(", connecting to udp://") + self.config["host"] return _("disconnected") def configured(self): return self.plugs[0].sock is not None and self.config["host"] virtualbricks-1.0.2/virtualbricks/tuntaps.py000066400000000000000000000110701262207653100213350ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_tuntaps -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os from collections import OrderedDict as odict from virtualbricks import bricks, link, settings if False: # pyflakes _ = str class PrivilegedBrick(bricks.Brick): def needsudo(self): return os.geteuid() != 0 class CaptureConfig(bricks.Config): parameters = {"iface": bricks.String("")} class Capture(PrivilegedBrick): type = "Capture" config_factory = CaptureConfig def __init__(self, factory, name): bricks.Brick.__init__(self, factory, name) self.plugs.append(link.Plug(self)) self.command_builder = odict((("-s", self.sock_path), ("*iface", "iface"))) def sock_path(self): if self.plugs[0].sock: return self.plugs[0].sock.path.rstrip("[]") return "" def get_parameters(self): if self.config["iface"] == "": return _("No interface selected") if self.plugs[0].sock: return _("Interface %s plugged to %s ") % ( self.config["iface"], self.plugs[0].sock.brick.name) return _("Interface %s disconnected") % self.config["iface"] def prog(self): return settings.get("vdepath") + "/vde_pcapplug" def open_console(self): pass def configured(self): return self.plugs[0].sock and self.config["iface"] class TapConfig(bricks.Config): parameters = {"ip": bricks.String("10.0.0.1"), "nm": bricks.String("255.255.255.0"), "gw": bricks.String(""), "mode": bricks.String("off")} class Tap(PrivilegedBrick): type = "Tap" config_factory = TapConfig def __init__(self, factory, name): bricks.Brick.__init__(self, factory, name) self.plugs.append(link.Plug(self)) self.command_builder["-s"] = self.sock_path self.command_builder["*tap"] = self.get_name def sock_path(self): if self.plugs[0].sock: return self.plugs[0].sock.path.rstrip("[]") return "" def get_parameters(self): if self.configured(): return _("plugged to %s ") % self.plugs[0].sock.brick.name return _("disconnected") def prog(self): return os.path.join(settings.get("vdepath"), "vde_plug2tap") def open_console(self): pass def configured(self): return bool(self.plugs[0].sock) def post_poweron(self): # XXX: fixme self.start_related_events(on=True) if self.config["mode"] == 'dhcp': if self.needsudo(): os.system(settings.get('sudo') + ' "dhclient ' + self.name + '"') else: os.system('dhclient ' + self.name) elif self.config["mode"] == 'manual': if self.needsudo(): # XXX Ugly, can't we ioctls? os.system(settings.get('sudo') + ' "/sbin/ifconfig ' + self.name + ' ' + self.config["ip"] + ' netmask ' + self.config["nm"] + '"') if (len(self.config["gw"]) > 0): os.system(settings.get('sudo') + ' "/sbin/route add default gw ' + self.config["gw"] + ' dev ' + self.name + '"') else: os.system('/sbin/ifconfig ' + self.name + ' ' + self.config["ip"] + ' netmask ' + self.config["nm"]) if (len(self.config["gw"]) > 0): os.system('/sbin/route add default gw ' + self.config["gw"] + ' dev ' + self.name) else: return virtualbricks-1.0.2/virtualbricks/versions.py000066400000000000000000000047711262207653100215210ustar00rootroot00000000000000# Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import sys import collections _Version = collections.namedtuple("_Version", ["major", "minor", "micro", "prerelease"]) class Version(_Version): """Utility class to represent a version. Copy&paste from twisted. All rights to them. """ def __new__(self, package, major, minor, micro=0, prerelease=None): self.package = package return _Version.__new__(self, major, minor, micro, prerelease) def _make(cls, package, iterable, new=tuple.__new__, len=len): raise NotImplementedError("Version._make not implemented") def short(self): """ Return a string in canonical short version format, ..[+rVer]. """ bzrver = self._getBazaarVersion() if bzrver: return str(self) + '+r' + bzrver return str(self) def __str__(self): if self.prerelease is None: pre = "" else: pre = "pre%s" % (self.prerelease,) return '%d.%d.%d%s' % (self.major, self.minor, self.micro, pre) def _getBazaarVersion(self): mod = sys.modules.get(self.package) if mod: bzr = os.path.join(os.path.dirname(mod.__file__), "..", ".bzr") if not os.path.exists(bzr): return None lastrev = os.path.join(bzr, "branch", "last-revision") if os.path.exists(lastrev): try: with open(lastrev) as fp: return fp.readline().split()[0] except Exception: return "Unknown" virtualbricks-1.0.2/virtualbricks/virtualmachines.py000066400000000000000000000652331262207653100230470ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_virtualmachines -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import errno import re import datetime import shutil import itertools from twisted.internet import utils, defer from virtualbricks import (errors, tools, settings, bricks, log, project, observable) if False: _ = str __metaclass__ = type logger = log.Logger() new_cow = log.Event("Creating a new private COW from {base} image.") invalid_base = log.Event("{cowname} private cow found with a different base " "image ({base}): moving it in {path}") powerdown = log.Event("Sending powerdown to {vm}") update_usb = log.Event("update_usbdevlist: old {old} - new {new}") own_err = log.Event("plug {plug} does not belong to {brick}") acquire_lock = log.Event("Aquiring disk locks") release_lock = log.Event("Releasing disk locks") class UsbDevice: def __init__(self, ID, desc=""): self.ID = ID self.desc = desc def __eq__(self, other): if not isinstance(other, self.__class__): return NotImplemented return self.ID == other.ID def __ne__(self, other): if not isinstance(other, self.__class__): return NotImplemented return not self.__eq__(other) def __hash__(self): return hash(self.ID) def __str__(self): return str(self.ID) def __repr__(self): return str(self.ID) def __format__(self, format_string): if format_string == "id": return str(self.ID) elif format_string == "d": return str(self.desc) elif format_string == "": return str(self) raise ValueError("invalid format string" + repr(format_string)) class Wrapper: def __init__(self, original): self.__dict__["original"] = original def __getattr__(self, name): try: return getattr(self.original, name) except AttributeError: raise AttributeError("{0.__class__.__name__}.{1}".format( self, name)) def __setattr__(self, name, value): if name in self.__dict__: self.__dict__[name] = value else: for klass in self.__class__.__mro__: if name in klass.__dict__: self.__dict__[name] = value break else: setattr(self.original, name, value) class VMPlug(Wrapper): def __init__(self, plug): Wrapper.__init__(self, plug) self.model = "rtl8139" self.mac = tools.random_mac() class VMSock(Wrapper): def __init__(self, sock): Wrapper.__init__(self, sock) self.model = "rtl8139" self.mac = tools.random_mac() def connect(self, endpoint): return class _FakeBrick: name = "hostonly" def poweron(self): return defer.succeed(self) class _HostonlySock: """ This is dummy implementation of a VMSock used with VirtualMachines that want a plug that is not connected to nothing. The instance is a singleton, but not enforced anyhow, maybe a better solution is to have a different hostonly socket for each plug and let the brick choose which socket should be saved and which not. """ nickname = "_hostonly" path = "?" model = "?" mac = "?" mode = "hostonly" brick = _FakeBrick() plugs = [] hostonly_sock = _HostonlySock() class Image: readonly = False master = None _description = None _name = "" def __init__(self, name, path, description=""): self.observable = observable.Observable("changed") self._name = name self.path = os.path.abspath(path) if description: self.set_description(description) def _description_file(self): return self.path + ".vbdescr" def set_description(self, descr): if descr != self._description: self._description = descr try: with open(self._description_file(), "w") as fp: fp.write(descr) except IOError: pass self.observable.notify("changed", self) def get_description(self): if self._description is None: try: with open(self._description_file()) as fp: return fp.read() except IOError: return "" else: return self._description description = property(get_description, set_description) def set_name(self, value): self._name = value self.observable.notify("changed", self) def get_name(self): return self._name name = property(get_name, set_name) def basename(self): return os.path.basename(self.path) def get_size(self): if not self.exists(): return "0" size = os.path.getsize(self.path) if size > 1000000: return str(size / 1000000) else: return str(size / 1000000.0) def exists(self): return os.path.exists(self.path) def acquire(self, disk): if self.master in (None, disk): self.master = disk else: raise errors.LockedImageError(self, self.master) def release(self, disk): if self.master is disk: self.master = None else: raise errors.LockedImageError(self, self.master) def save_to(self, fileobj): fileobj.write("[Image:{0.name}]\npath={0.path}\n\n".format(self)) def __format__(self, format_string): if format_string in ("n", ""): return str(self.name) elif format_string == "p": return str(self.path) elif format_string == "d": return str(self.get_description()) elif format_string == "m": if self.master is None: return "" return repr(self.master) elif format_string == "s": return self.get_size() raise ValueError("invalid format string " + repr(format_string)) def move(src, dst): try: os.rename(src, dst) except OSError as e: if e.errno == errno.EXDEV: shutil.move(src, dst) else: raise def is_missing(path, file): return not os.access(os.path.join(path, file), os.X_OK) class Disk: sync_cmd = "sync" image = None @property def cow(self): return self.VM.config["private" + self.device] @property def basefolder(self): return project.manager.current.path @property def vm_name(self): return self.VM.name def __init__(self, VM, dev): self.VM = VM self.device = dev def _virtio_args_cb(self, disk_name): return ["-drive", "file={0},if=virtio".format(disk_name)] def _args_cb(self, disk_name): return ["-" + self.device, disk_name] def args(self): if self.image: d = self.get_real_disk_name() if self.VM.get("use_virtio"): d.addCallback(self._virtio_args_cb) else: d.addCallback(self._args_cb) return d else: return defer.succeed([]) def set_image(self, image): self.image = image def acquire(self): if self.image and not self.cow and not self.readonly(): self.image.acquire(self) def release(self): if self.image and not self.cow and not self.readonly(): self.image.release(self) def _get_base(self): return self.image.path def _sync(self, ret): def complain_on_error(ret): out, err, code = ret if code != 0: raise RuntimeError("sync failed\n%s" % err) out, err, code = ret if code != 0: raise RuntimeError("Cannot create private COW\n%s" % err) exit = utils.getProcessOutputAndValue(self.sync_cmd, env=os.environ) exit.addCallback(complain_on_error) return exit def _create_cow(self, cowname): if is_missing(settings.get("qemupath"), "qemu-img"): msg = _("qemu-img not found! I can't create a new image.") return defer.fail(errors.BadConfigError(msg)) logger.info(new_cow, base=self._get_base()) args = ["create", "-b", self._get_base(), "-f", settings.get("cowfmt"), cowname] exe = os.path.join(settings.get("qemupath"), "qemu-img") exit = utils.getProcessOutputAndValue(exe, args, os.environ) exit.addCallback(self._sync) exit.addCallback(lambda _: cowname) return exit def _check_base(self, cowname): with open(cowname) as fp: backing_file = tools.get_backing_file(fp) if backing_file == self._get_base(): return defer.succeed(cowname) else: dt = datetime.datetime.now() cowback = cowname + ".back-" + dt.strftime("%Y-%m-%d_%H-%M-%S") logger.debug(invalid_base, cowname=cowname, base=backing_file, path=cowback) move(cowname, cowback) return self._create_cow(cowname).addCallback(lambda _: cowname) def _get_cow_name(self): try: os.makedirs(self.basefolder) except OSError as e: if e.errno != errno.EEXIST: raise cowname = self.get_cow_path() try: return self._check_base(cowname) except IOError, e: if e.errno == errno.ENOENT: return self._create_cow(cowname) else: raise def get_cow_path(self): return os.path.join(self.basefolder, "%s_%s.cow" % (self.vm_name, self.device)) def get_real_disk_name(self): if self.image is None: # XXX: this should be really an error return defer.succeed("") elif self.cow: try: return self._get_cow_name() except (OSError, IOError) as e: return defer.fail(e) else: return defer.succeed(self.image.path) def readonly(self): return self.VM.config["snapshot"] def __deepcopy__(self, memo): new = type(self)(self.VM, self.device) new.sync_cmd = self.sync_cmd if self.image is not None: new.set_image(self.image) return new def __repr__(self): return "".format( self=self, readonly=self.readonly()) VM_COMMAND_BUILDER = { "#argv0": "argv0", "#M": "machine", "#cpu": "cpu", "-smp": "smp", "-m": "ram", "-boot": "boot", # numa not supported "#privatehda": "privatehda", "#privatehdb": "privatehdb", "#privatehdc": "privatehdc", "#privatehdd": "privatehdd", "#privatefda": "privatefda", "#privatefdb": "privatefdb", "#privatemtdblock": "privatemtdblock", "#cdrom": "cdrom", "#device": "device", "#cdromen": "cdromen", "#deviceen": "deviceen", "#keyboard": "keyboard", "#usbdevlist": "usbdevlist", "-soundhw": "soundhw", "-usb": "usbmode", # "-uuid": "uuid", # "-curses": "curses", ## not implemented # "-no-frame": "noframe", ## not implemented # "-no-quit": "noquit", ## not implemented. "-snapshot": "snapshot", "#vga": "vga", "#vncN": "vncN", "#vnc": "vnc", # "-full-screen": "full-screen", ## TODO 0.3 "-sdl": "sdl", "-portrait": "portrait", "-win2k-hack": "win2k", # not implemented "-no-acpi": "noacpi", # "-no-hpet": "nohpet", ## ??? # "-baloon": "baloon", ## ??? # #acpitable not supported # #smbios not supported "#kernel": "kernel", "#kernelenbl": "kernelenbl", "#append": "kopt", "#initrd": "initrd", "#initrdenbl": "initrdenbl", # "-serial": "serial", # "-parallel": "parallel", # "-monitor": "monitor", # "-qmp": "qmp", # "-mon": "", # "-pidfile": "", ## not needed # "-singlestep": "", # "-S": "", "#gdb_e": "gdb", "#gdb_port": "gdbport", # "-s": "", # "-d": "", # "-hdachs": "", # "-L": "", # "-bios": "", "#kvm": "kvm", # "-no-reboot": "", ## not supported # "-no-shutdown": "", ## not supported "-loadvm": "loadvm", # "-daemonize": "", ## not supported # "-option-rom": "", # "-clock": "", "#rtc": "rtc", # "-icount": "", # "-watchdog": "", # "-watchdog-action": "", # "-echr": "", # "-virtioconsole": "", ## future # "-show-cursor": "", # "-tb-size": "", # "-incoming": "", # "-nodefaults": "", # "-chroot": "", # "-runas": "", # "-readconfig": "", # "-writeconfig": "", # "-no-kvm": "", ## already implemented otherwise # "-no-kvm-irqchip": "", # "-no-kvm-pit": "", # "-no-kvm-pit-reinjection": "", # "-pcidevice": "", # "-enable-nesting": "", # "-nvram": "", "-tdf": "tdf", "#kvmsm": "kvmsm", "#kvmsmem": "kvmsmem", # "-mem-path": "", # "-mem-prealloc": "", "#icon": "icon", "#serial": "serial", "#stdout": ""} class DefaultDevice: def __ne__(self, other): if isinstance(other, Disk): return other.image is not None return NotImplemented def __eq__(self, other): return not self != other default_device = DefaultDevice() class Device(bricks.Parameter): def __init__(self, name): self.name = name bricks.Parameter.__init__(self, default_device) def from_string_brick(self, in_string, brick): disk = brick.config[self.name] disk.set_image(brick.factory.get_image_by_name(in_string)) return disk def to_string(self, disk): if disk.image is not None: return disk.image.name return "" class UsbDeviceParameter(bricks.String): def from_string(self, in_string): return UsbDevice(in_string) def to_string(self, in_object): return str(in_object) class VirtualMachineConfig(bricks.Config): parameters = {"name": bricks.String(""), # boot options "boot": bricks.String(""), "snapshot": bricks.Boolean(False), # cdrom device "deviceen": bricks.Boolean(False), "device": bricks.String(""), "cdromen": bricks.Boolean(False), "cdrom": bricks.String(""), # additional media "use_virtio": bricks.Boolean(False), "hda": Device("hda"), "privatehda": bricks.Boolean(False), "hdb": Device("hdb"), "privatehdb": bricks.Boolean(False), "hdc": Device("hdc"), "privatehdc": bricks.Boolean(False), "hdd": Device("hdd"), "privatehdd": bricks.Boolean(False), "fda": Device("fda"), "privatefda": bricks.Boolean(False), "fdb": Device("fdb"), "privatefdb": bricks.Boolean(False), "mtdblock": Device("mtdblock"), "privatemtdblock": bricks.Boolean(False), # system and machine "argv0": bricks.String("qemu-system-i386"), "cpu": bricks.String(""), "machine": bricks.String(""), "kvm": bricks.Boolean(False), "smp": bricks.SpinInt(1, 1, 64), # audio device soundcard "soundhw": bricks.String(""), # memory device settings "ram": bricks.SpinInt(64, 1, 99999), "kvmsm": bricks.Boolean(False), "kvmsmem": bricks.SpinInt(1, 0, 99999), # display options "novga": bricks.Boolean(False), "vga": bricks.Boolean(False), "vnc": bricks.Boolean(False), "vncN": bricks.SpinInt(1, 0, 500), "sdl": bricks.Boolean(False), "portrait": bricks.Boolean(False), # usb settings "usbmode": bricks.Boolean(False), "usbdevlist": bricks.ListOf(UsbDeviceParameter("")), # extra settings "rtc": bricks.Boolean(False), "tdf": bricks.Boolean(False), "keyboard": bricks.String(""), "serial": bricks.Boolean(False), # booting linux "kernelenbl": bricks.Boolean(False), "kernel": bricks.String(""), "initrdenbl": bricks.Boolean(False), "initrd": bricks.String(""), "kopt": bricks.String(""), "gdb": bricks.Boolean(False), "gdbport": bricks.SpinInt(1234, 1, 65535), # virtual machine icon "icon": bricks.String(""), # others "noacpi": bricks.String(""), "stdout": bricks.String(""), "loadvm": bricks.String("")} def _get_nick(link): if hasattr(link, "sock"): return str(getattr(link.sock, "nickname", "None")) return "None" class VirtualMachine(bricks.Brick): type = "Qemu" term_command = "unixterm" command_builder = VM_COMMAND_BUILDER config_factory = VirtualMachineConfig process_protocol = bricks.Process def __init__(self, factory, name): bricks.Brick.__init__(self, factory, name) self._observable.add_event("image-changed") self.image_changed = observable.Event(self._observable, "image-changed") self.config["name"] = name for dev in "hda", "hdb", "hdc", "hdd", "fda", "fdb", "mtdblock": self.config[dev] = Disk(self, dev) def poweron(self, snapshot=""): def acquire(passthru): self.acquire() return passthru def release(passthru): self.release() return passthru def clear_snapshot(passthru): self.config["loadvm"] = "" return passthru self.config["loadvm"] = snapshot d = bricks.Brick.poweron(self) d.addCallback(acquire).addBoth(clear_snapshot) self._exited_d.addBoth(release) return d def poweroff(self, kill=False, term=False): if self.proc is None: return defer.succeed((self, self._last_status)) elif not any((kill, term)): self.logger.info(powerdown, vm=self) self.send("system_powerdown\n") return self._exited_d if term: return bricks.Brick.poweroff(self) else: return bricks.Brick.poweroff(self, kill) def get_parameters(self): ram = self.config["ram"] txt = [_("command:") + " %s, ram: %s" % (self.prog(), ram)] for i, link in enumerate(itertools.chain(self.plugs, self.socks)): txt.append("eth%d: %s" % (i, _get_nick(link))) return ", ".join(txt) def update_usbdevlist(self, dev): self.logger.debug(update_usb, old=self.config["usbdevlist"], new=dev) for device in set(dev) - set(self.config["usbdevlist"]): self.send("usb_add host:{0}\n".format(device)) # FIXME: Don't know how to remove old devices, due to the ugly syntax # of usb_del command. def configured(self): # return all([p.configured() for p in self.plugs]) for p in self.plugs: if p.sock is None and p.mode == 'vde': return False return True def prog(self): if self.config["argv0"] and not self.config["kvm"]: return os.path.join(settings.get("qemupath"), self.config["argv0"]) elif self.config["kvm"]: return os.path.join(settings.get("qemupath"), "kvm") else: return os.path.join(settings.get("qemupath"), "qemu") def args(self): d = defer.gatherResults([disk.args() for disk in self.disks()]) d.addCallback(self.__args) return d def __args(self, results): res = [self.prog()] if not self.config["kvm"]: if self.config["machine"] != "": res.extend(["-M", self.config["machine"]]) if self.config["cpu"]: res.extend(["-cpu", self.config["cpu"]]) res.extend(list(self.build_cmd_line())) if self.config["novga"]: res.extend(["-display", "none"]) for disk_args in results: res.extend(disk_args) if self.config["kernelenbl"] and self.config["kernel"]: res.extend(["-kernel", self.config["kernel"]]) if self.config["initrdenbl"] and self.config["initrd"]: res.extend(["-initrd", self.config["initrd"]]) if (self.config["kopt"] and self.config["kernelenbl"] and self.config["kernel"]): res.extend(["-append", "'" + re.sub("\"", "", self.config["kopt"]) + "'"]) if self.config["gdb"]: res.extend(["-gdb", "tcp::%d" % self.config["gdbport"]]) if self.config["vnc"]: res.extend(["-vnc", ":%d" % self.config["vncN"]]) if self.config["vga"]: res.extend(["-vga", "std"]) if self.config["usbmode"]: for dev in self.config["usbdevlist"]: res.extend(["-usbdevice", "host:%s" % dev]) res.extend(["-name", self.name]) if not self.plugs and not self.socks: res.extend(["-net", "none"]) else: for i, link in enumerate(itertools.chain(self.plugs, self.socks)): res.append("-device") res.append("{1.model},vlan={0},mac={1.mac},id=eth{0}".format( i, link)) if link.sock and link.sock.mode == "hostonly": res.extend(("-net", "user,vlan={0}".format(i))) elif link.mode == "vde": res.append("-net") res.append("vde,vlan={0},sock={1}".format( i, link.sock.path.rstrip('[]'))) elif link.mode == "sock": res.append("-net") res.append("vde,vlan={0},sock={1}".format( i, link.path)) else: res.extend(["-net", "user"]) if self.config["cdromen"] and self.config["cdrom"]: res.extend(["-cdrom", self.config["cdrom"]]) elif self.config["deviceen"] and self.config["device"]: res.extend(["-cdrom", self.config["device"]]) if self.config["rtc"]: res.extend(["-rtc", "base=localtime"]) if len(self.config["keyboard"]) == 2: res.extend(["-k", self.config["keyboard"]]) if self.config["kvmsm"]: res.extend(["-kvm-shadow-memory", self.config["kvmsmem"]]) if self.config["serial"]: res.extend(["-serial", "unix:%s/%s_serial,server,nowait" % (settings.VIRTUALBRICKS_HOME, self.name)]) res.extend(["-mon", "chardev=mon", "-chardev", "socket,id=mon,path=%s,server,nowait" % self.console(), "-mon", "chardev=mon_cons", "-chardev", "stdio,id=mon_cons,signal=off"]) return res def add_sock(self, mac=None, model=None): s = self.factory.new_sock(self) sock = VMSock(s) vlan = len(self.plugs) + len(self.socks) sock.path = "{0}/{1.brick.name}_sock_eth{2}[]".format( settings.VIRTUALBRICKS_HOME, sock, vlan) sock.nickname = "{0.brick.name}_sock_eth{1}".format(sock, vlan) self.socks.append(sock) if mac: sock.mac = mac if model: sock.model = model return sock def add_plug(self, sock, mac=None, model=None): plug = VMPlug(self.factory.new_plug(self)) self.plugs.append(plug) if sock: plug.connect(sock) if mac: plug.mac = mac if model: plug.model = model return plug def connect(self, sock, *args): self.add_plug(sock, *args) def remove_plug(self, plug): try: if plug.mode == "sock": self.socks.remove(plug) else: self.plugs.remove(plug) except ValueError: self.logger.error(own_err, plug=plug, brick=self) def commit_disks(self, args): # XXX: fixme self.send("commit all\n") def acquire(self): """Acquire locks on images if needed.""" self.logger.debug(acquire_lock) acquired = [] for disk in self.disks(): try: disk.acquire() except errors.LockedImageError: for _disk in acquired: _disk.release() raise else: acquired.append(disk) def release(self): self.logger.debug(release_lock) for disk in self.disks(): disk.release() def disks(self): for hd in "hda", "hdb", "hdc", "hdd", "fda", "fdb", "mtdblock": yield self.config[hd] def set_image(self, disk, image): self.config[disk].image = image if not self._restore: self._observable.notify("image-changed", (self, image)) def set_vm(self, disk): disk.VM = self cbset_hda = cbset_hdb = cbset_hdc = cbset_hdd = cbset_fda = cbset_fdb = \ cbset_mtblock = set_vm def is_virtualmachine(brick): return brick.get_type() == "Qemu" virtualbricks-1.0.2/virtualbricks/wires.py000066400000000000000000000165141262207653100210000ustar00rootroot00000000000000# -*- test-case-name: virtualbricks.tests.test_wires -*- # Virtualbricks - a vde/qemu gui written in python and GTK/Glade. # Copyright (C) 2013 Virtualbricks team # 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., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os import re from virtualbricks import bricks, settings if False: # pyflakes _ = str class Wire(bricks.Brick): type = "Wire" def __init__(self, factory, name): bricks.Brick.__init__(self, factory, name) self.plugs.append(factory.new_plug(self)) self.plugs.append(factory.new_plug(self)) def get_parameters(self): p0 = _("disconnected") p1 = _("disconnected") if len(self.plugs) == 2: if self.plugs[0].sock: p0 = self.plugs[0].sock.brick.name if self.plugs[1].sock: p1 = self.plugs[1].sock.brick.name if p0 != _('disconnected') and p1 != _('disconnected'): return _("Configured to connect {0} to {1}").format(p0, p1) elif len(self.plugs) == 1: if self.plugs[0].sock: p0 = self.plugs[0].sock.brick.name return _("Configured to connect {0} to {1}").format(p0, p1) return _("Not yet configured. Left plug is {0} and right plug is {1}" ).format(p0, p1) def configured(self): return len(self.plugs) == 2 and all(map(lambda p: p.sock, self.plugs)) def prog(self): return os.path.join(settings.get("vdepath"), "dpipe") def args(self): return [self.prog(), os.path.join(settings.get("vdepath"), "vde_plug"), # XXX: this is awful self.plugs[0].sock.path.rstrip('[]'), "=", os.path.join(settings.get("vdepath"), "vde_plug"), self.plugs[1].sock.path.rstrip('[]')] class NetemuConfig(bricks.Config): parameters = { "bandwidth": bricks.Integer(125000), "bandwidthr": bricks.Integer(125000), "bandwidthsymm": bricks.Boolean(True), "delay": bricks.Integer(0), "delayr": bricks.Integer(0), "delaysymm": bricks.Boolean(True), "chanbufsize": bricks.Integer(75000), "chanbufsizer": bricks.Integer(75000), "chanbufsizesymm": bricks.Boolean(True), "loss": bricks.SpinFloat(0, 0, 100), "lossr": bricks.SpinFloat(0, 0, 100), "losssymm": bricks.Boolean(True), } class WFProcessProtocol(bricks.VDEProcessProtocol): prompt = re.compile(r"^VDEwf\$ ", re.M) class Netemu(Wire): type = "Netemu" config_factory = NetemuConfig process_protocol = WFProcessProtocol def __init__(self, factory, name): Wire.__init__(self, factory, name) self.command_builder = { "--nofifo": lambda: "*", "-M": self.console, } def args(self): res = [self.prog(), "-v", self.plugs[0].sock.path.rstrip('[]') + ":" + self.plugs[1].sock.path.rstrip('[]')] # Bandwidth if self.config["bandwidthsymm"]: res.extend(["-b", str(self.config["bandwidth"])]) else: res.extend(["-b", "LR {0}".format(self.config["bandwidth"])]) res.extend(["-b", "RL {0}".format(self.config["bandwidthr"])]) # Delay if self.config["delaysymm"]: res.extend(["-d", str(self.config["delay"])]) else: res.extend(["-d", "LR {0}".format(self.config["delay"])]) res.extend(["-d", "RL {0}".format(self.config["delayr"])]) # Chanbufsize if self.config["chanbufsizesymm"]: res.extend(["-c", str(self.config["chanbufsize"])]) else: res.extend(["-c", "LR {0}".format(self.config["chanbufsize"])]) res.extend(["-c", "RL {0}".format(self.config["chanbufsizer"])]) # Loss if self.config["losssymm"]: res.extend(["-l", str(self.config["loss"])]) else: res.extend(["-l", "LR {0}".format(self.config["loss"])]) res.extend(["-l", "RL {0}".format(self.config["lossr"])]) res.extend(bricks.Brick.build_cmd_line(self)) return res def prog(self): return "vde-netemu" def set(self, attrs): self._set(attrs, "chanbufsizesymm", "chanbufsize", "chanbufsizer") self._set(attrs, "delaysymm", "delay", "delayr") self._set(attrs, "bandwidthsymm", "bandwidth", "bandwidthr") self._set(attrs, "losssymm", "loss", "lossr") Wire.set(self, attrs) def _set(self, attrs, symm, left_to_right, right_to_left): if symm in attrs and attrs[symm] != self.config[symm]: if left_to_right in attrs: self.config[left_to_right] = attrs.pop(left_to_right) if right_to_left in attrs: self.config[right_to_left] = attrs.pop(right_to_left) # callbacks for live-management def cbset_chanbufsize(self, value): if self.config["chanbufsizesymm"]: self.send("chanbufsize {0}\n".format(value)) else: self.send("chanbufsize LR {0}\n".format(value)) def cbset_chanbufsizer(self, value): if not self.config["chanbufsizesymm"]: self.send("chanbufsize RL {0}\n".format(value)) def cbset_chanbufsizesymm(self, value): self.cbset_chanbufsize(self.config["chanbufsize"]) self.cbset_chanbufsizer(self.config["chanbufsizer"]) def cbset_delay(self, value): if self.config["delaysymm"]: self.send("delay {0}\n".format(value)) else: self.send("delay LR {0}\n".format(value)) def cbset_delayr(self, value): if not self.config["delaysymm"]: self.send("delay RL {0}\n".format(value)) def cbset_delaysymm(self, value): self.cbset_delay(self.config["delay"]) self.cbset_delayr(self.config["delayr"]) def cbset_loss(self, value): if self.config["losssymm"]: self.send("loss {0}\n".format(value)) else: self.send("loss LR {0}\n".format(value)) def cbset_lossr(self, value): if not self.config["losssymm"]: self.send("loss RL {0}\n".format(value)) def cbset_losssymm(self, value): self.cbset_loss(self.config["loss"]) self.cbset_lossr(self.config["lossr"]) def cbset_bandwidth(self, value): if self.config["bandwidthsymm"]: self.send("bandwidth {0}\n".format(value)) else: self.send("bandwidth LR {0}\n".format(value)) def cbset_bandwidthr(self, value): if not self.config["bandwidthsymm"]: self.send("bandwidth RL {0}\n".format(value)) def cbset_bandwidthsymm(self, value): self.cbset_bandwidth(self.config["bandwidth"]) self.cbset_bandwidthr(self.config["bandwidthr"])