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)
Exemple #13
0
            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)
Exemple #14
0
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)