return { "rules": list(), "allow": False, "allowDns": False, "allowIcmp": False, "allowYumProxy": True } @property def rootcow_img(self): return self.storage.rootcow_img def clone_disk_files(self, src_vm, verbose): if dry_run: return super(QubesTemplateVm, self).clone_disk_files(src_vm=src_vm, verbose=verbose) # Create root-cow.img self.commit_changes(verbose=verbose) def commit_changes (self, verbose = False): self.log.debug('commit_changes()') if not vmm.offline_mode: assert not self.is_running(), "Attempt to commit changes on running Template VM!" if verbose: print >> sys.stderr, "--> Commiting template updates... COW: {0}...".format (self.rootcow_img) if dry_run: return self.storage.commit_template_changes() register_qubes_vm_class(QubesTemplateVm)
if conf["allowDns"] and self.netvm is not None: # PREROUTING does DNAT to NetVM DNSes, so we need self.netvm. # properties iptables += "-A FORWARD -s {0} -p udp -d {1} --dport 53 -j " \ "ACCEPT\n".format(ip,self.netvm.gateway) iptables += "-A FORWARD -s {0} -p udp -d {1} --dport 53 -j " \ "ACCEPT\n".format(ip,self.netvm.secondary_dns) iptables += "-A FORWARD -s {0} -p tcp -d {1} --dport 53 -j " \ "ACCEPT\n".format(ip,self.netvm.gateway) iptables += "-A FORWARD -s {0} -p tcp -d {1} --dport 53 -j " \ "ACCEPT\n".format(ip,self.netvm.secondary_dns) if conf["allowIcmp"]: iptables += "-A FORWARD -s {0} -p icmp -j ACCEPT\n".format(ip) if conf["allowYumProxy"]: iptables += "-A FORWARD -s {0} -p tcp -d {1} --dport {2} -j ACCEPT\n".format(ip, yum_proxy_ip, yum_proxy_port) else: iptables += "-A FORWARD -s {0} -p tcp -d {1} --dport {2} -j DROP\n".format(ip, yum_proxy_ip, yum_proxy_port) iptables += "-A FORWARD -s {0} -j {1}\n".format(ip, default_action) iptables += "COMMIT\n" self.qdb.write("/qubes-iptables-domainrules/"+str(xid), iptables) # no need for ending -A FORWARD -j DROP, cause default action is DROP self.write_netvm_domid_entry() self.rules_applied = None self.qdb.write("/qubes-iptables", 'reload') register_qubes_vm_class(QubesProxyVm)
def suspend(self): if dry_run: return if not self.is_running() and not self.is_paused(): raise QubesException ("VM not running!") self.pause() def is_guid_running(self): # If user force the guiagent, is_guid_running will mimic a standard QubesVM if self.guiagent_installed: return super(QubesHVm, self).is_guid_running() else: xid = self.stubdom_xid if xid < 0: return False if not os.path.exists('/var/run/qubes/guid-running.%d' % xid): return False return True def is_fully_usable(self): # Running gui-daemon implies also VM running if not self.is_guid_running(): return False if self.qrexec_installed and not self.is_qrexec_running(): return False return True register_qubes_vm_class(QubesHVm)
def get_cputime(self): # TODO: measure it somehow return 0 def get_disk_usage(self, file_or_dir): return 0 def get_disk_utilization(self): return 0 def get_disk_utilization_private_img(self): return 0 def get_private_img_sz(self): return 0 @property def ip(self): return "10.137.0.2" def start(self, **kwargs): raise QubesException ("Cannot start Dom0 fake domain!") def suspend(self): return def verify_files(self): return True register_qubes_vm_class(QubesAdminVm)
raise QubesException("Cannot resize root.img while any VM " "based on this tempate is running") return super(QubesTemplateHVm, self).resize_root_img(size) def start(self, *args, **kwargs): for vm in self.appvms.values(): if vm.is_running(): raise QubesException( "Cannot start HVM template while VMs based on it are running" ) return super(QubesTemplateHVm, self).start(*args, **kwargs) def commit_changes(self, verbose=False): self.log.debug('commit_changes()') if not vmm.offline_mode: assert not self.is_running( ), "Attempt to commit changes on running Template VM!" if verbose: print >> sys.stderr, "--> Commiting template updates... COW: {0}...".format( self.rootcow_img) if dry_run: return self.storage.commit_template_changes() register_qubes_vm_class(QubesTemplateHVm)
raise QubesException( "For your own safety shringing of root.img is disabled. If " "you really know what you are doing, use 'truncate' manually.") f_root = open(self.root_img, "a+b") f_root.truncate(size) f_root.close() class QubesResizableVmWithResize2fs(QubesResizableVm): def resize_root_img(self, size, allow_start=False): super(QubesResizableVmWithResize2fs, self).\ resize_root_img(size, allow_start=allow_start) if not allow_start: raise QubesException("VM start required to complete the " "operation, but not allowed. Either run the " "operation again allowing VM start this " "time, or run resize2fs in the VM manually.") self.start(start_guid=False) self.run("resize2fs /dev/mapper/dmroot", user="******", wait=True, gui=False) self.shutdown() while self.is_running(): sleep(1) register_qubes_vm_class(QubesResizableVm) register_qubes_vm_class(QubesResizableVmWithResize2fs)
if verbose: print >> sys.stderr, "--> Starting the VM..." self.libvirt_domain.resume() print >>sys.stderr, "time=%s, resumed" % (str(time.time())) # close() is not really needed, because the descriptor is close-on-exec # anyway, the reason to postpone close() is that possibly xl is not done # constructing the domain after its main process exits # so we close() when we know the domain is up # the successful unpause is some indicator of it if qmemman_present: qmemman_client.close() if self._start_guid_first and kwargs.get('start_guid', True) and os.path.exists('/var/run/shm.id'): self.start_guid(verbose=verbose, notify_function=kwargs.get('notify_function', None)) self.start_qrexec_daemon(verbose=verbose, notify_function=kwargs.get('notify_function', None)) print >>sys.stderr, "time=%s, qrexec done" % (str(time.time())) if not self._start_guid_first and kwargs.get('start_guid', True) and os.path.exists('/var/run/shm.id'): self.start_guid(verbose=verbose, notify_function=kwargs.get('notify_function', None)) print >>sys.stderr, "time=%s, guid done" % (str(time.time())) return self.xid # register classes register_qubes_vm_class(QubesDisposableVm)
pass try: vm.attach_network(wait=False) except QubesException as ex: print >> sys.stderr, ("WARNING: Cannot attach to network to '{0}': {1}".format(vm.name, ex)) return xid def shutdown(self, force=False): if dry_run: return connected_vms = [vm for vm in self.connected_vms.values() if vm.is_running()] if connected_vms and not force: raise QubesException("There are other VMs connected to this VM: " + str([vm.name for vm in connected_vms])) super(QubesNetVm, self).shutdown(force=force) def add_external_ip_permission(self, xid): if int(xid) < 0: return self.__external_ip_allowed_xids.add(int(xid)) self.update_external_ip_permissions() def remove_external_ip_permission(self, xid): self.__external_ip_allowed_xids.discard(int(xid)) self.update_external_ip_permissions() register_qubes_vm_class(QubesNetVm)
# TODO: measure it somehow return 0 def get_disk_usage(self, file_or_dir): return 0 def get_disk_utilization(self): return 0 def get_disk_utilization_private_img(self): return 0 def get_private_img_sz(self): return 0 @property def ip(self): return "10.137.0.2" def start(self, **kwargs): raise QubesException("Cannot start Dom0 fake domain!") def suspend(self): return def verify_files(self): return True register_qubes_vm_class(QubesAdminVm)
if size < self.get_root_img_sz(): raise QubesException( "For your own safety shringing of root.img is disabled. If " "you really know what you are doing, use 'truncate' manually.") f_root = open(self.root_img, "a+b") f_root.truncate(size) f_root.close() class QubesResizableVmWithResize2fs(QubesResizableVm): def resize_root_img(self, size, allow_start=False): super(QubesResizableVmWithResize2fs, self).\ resize_root_img(size, allow_start=allow_start) if not allow_start: raise QubesException("VM start required to complete the " "operation, but not allowed. Either run the " "operation again allowing VM start this " "time, or run resize2fs in the VM manually.") self.start(start_guid=False) self.run("resize2fs /dev/mapper/dmroot", user="******", wait=True, gui=False) self.shutdown() while self.is_running(): sleep(1) register_qubes_vm_class(QubesResizableVm) register_qubes_vm_class(QubesResizableVmWithResize2fs)
vm_iptables += "COMMIT\n" vms_rulesets.append((vm, vm_iptables)) iptables += "COMMIT\n" self.qdb.write("/qubes-iptables-domainrules/" + str(xid), iptables) # no need for ending -A PR-QBS-FORWARD -j DROP, cause default action is DROP self.write_netvm_domid_entry() self.rules_applied = None self.qdb.write("/qubes-iptables", 'reload') for vm, ruleset in vms_rulesets: shell_ruleset = "echo Adjusting firewall rules to: >&2\n" shell_ruleset += "echo %s >&2\n" % pipes.quote(ruleset.strip()) shell_ruleset += "data=$(iptables-save -t filter)\n" shell_ruleset += 'if ! echo "$data" | grep -q -- "^:FORTRESS-INPUT" ; then\n' shell_ruleset += ' data=$(echo "$data" | sed "s/^:INPUT/:FORTRESS-INPUT - [0:0]\\n\\0/")\n' shell_ruleset += "fi\n" shell_ruleset += 'if ! echo "$data" | grep -q -- "-A INPUT -j FORTRESS-INPUT" ; then\n' shell_ruleset += ' data=$(echo "$data" | sed -r "s|-A INPUT -i vif. -j REJECT --reject-with icmp-host-prohibited|-A INPUT -j FORTRESS-INPUT\\n\\0|")\n' shell_ruleset += "fi\n" shell_ruleset += 'data=$(echo "$data" | grep -v ^COMMIT$)\n' shell_ruleset += 'data=$(echo "$data" | grep -v -- "-A FORTRESS-INPUT")\n' shell_ruleset += 'data="$data\n"%s\n' % pipes.quote(ruleset) shell_ruleset += 'echo "$data" | iptables-restore -T filter\n' vm.adjust_own_firewall_rules(shell_ruleset) register_qubes_vm_class(QubesProxyVm)
# 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 from qubes.qubes import QubesVm,QubesVmLabel,register_qubes_vm_class,system_path class QubesAppVm(QubesVm): """ A class that represents an AppVM. A child of QubesVm. """ def get_attrs_config(self): attrs_config = super(QubesAppVm, self).get_attrs_config() attrs_config['dir_path']['func'] = \ lambda value: value if value is not None else \ os.path.join(system_path["qubes_appvms_dir"], self.name) return attrs_config @property def type(self): return "AppVM" def is_appvm(self): return True register_qubes_vm_class(QubesAppVm)
qmemman_client.close() if kwargs.get('start_guid', True) and os.path.exists('/var/run/shm.id'): self.start_guid(verbose=verbose, before_qrexec=True, notify_function=kwargs.get('notify_function', None)) self.start_qrexec_daemon(verbose=verbose, notify_function=kwargs.get( 'notify_function', None)) print >> sys.stderr, "time=%s, qrexec done" % (str(time.time())) if kwargs.get('start_guid', True) and os.path.exists('/var/run/shm.id'): self.start_guid(verbose=verbose, notify_function=kwargs.get('notify_function', None)) print >> sys.stderr, "time=%s, guid done" % (str(time.time())) return self.xid def remove_from_disk(self): # nothing to remove pass # register classes register_qubes_vm_class(QubesDisposableVm)
import os.path from qubes.qubes import ( register_qubes_vm_class, system_path, QubesResizableVmWithResize2fs, QubesVmLabel, ) class QubesAppVm(QubesResizableVmWithResize2fs): """ A class that represents an AppVM. A child of QubesVm. """ def get_attrs_config(self): attrs_config = super(QubesAppVm, self).get_attrs_config() attrs_config['dir_path']['func'] = \ lambda value: value if value is not None else \ os.path.join(system_path["qubes_appvms_dir"], self.name) return attrs_config @property def type(self): return "AppVM" def is_appvm(self): return True register_qubes_vm_class(QubesAppVm)