Exemplo n.º 1
0
    def forwards(self, orm):
        ds = get_datastore()
        cs = ConfigStore(ds)

        # Migrate global network configuration
        globalconf = orm.GlobalConfiguration.objects.order_by("-id")[0]
        cs.set('system.hostname', globalconf.gc_hostname + '.' + globalconf.gc_domain)
        cs.set('network.gateway.ipv4', globalconf.gc_ipv4gateway or None)
        cs.set('network.gateway.ipv6', globalconf.gc_ipv6gateway or None)
        cs.set('network.http_proxy', globalconf.gc_httpproxy or None)
        cs.set('network.dns.addresses', list(filter(None, [
            globalconf.gc_nameserver1 or None,
            globalconf.gc_nameserver2 or None,
            globalconf.gc_nameserver3 or None,
        ])))

        cs.set('network.netwait.enable', globalconf.gc_netwait_enabled)
        cs.set('network.netwait.addresses', globalconf.gc_netwait_ip.split())

        old_hosts = []
        # Migrate hosts database
        for line in globalconf.gc_hosts.split('\n'):
            line = line.strip()
            if not line:
                continue

            ip, *names = line.split(' ')
            old_hosts.extend([{'id': name, 'addresses': [ip]} for name in names])

        ensure_unique(ds, ('network.hosts', 'id'), old_ids=[x['id'] for x in old_hosts])
        for host in old_hosts:
            ds.insert('network.hosts', host)

        # Migrate VLAN interfaces configuration
        for unit, i in enumerate(orm.VLAN.objects.all()):
            ds.insert('network.interfaces', {
                'id': 'vlan{0}'.format(unit),
                'name': None,
                'type': 'VLAN',
                'cloned': True,
                'enabled': True,
                'dhcp': None,
                'rtadv': False,
                'noipv6': False,
                'mtu': None,
                'media': None,
                'mediaopts': [],
                'aliases': [],
                'vlan': {
                    'parent': i.vlan_pint,
                    'tag': i.vlan_tag
                },
                'capabilities': {
                    'add': [],
                    'del': []
                }
            })

        # Migrate LAGG interfaces configuration
        for unit, i in enumerate(orm.LAGGInterface.objects.all()):
            ds.insert('network.interfaces', {
                'id': 'lagg{0}'.format(unit),
                'name': None,
                'type': 'LAGG',
                'cloned': True,
                'enabled': True,
                'dhcp': None,
                'rtadv': False,
                'noipv6': False,
                'mtu': None,
                'media': None,
                'mediaopts': [],
                'aliases': [],
                'lagg': {
                    'protocol': LAGG_PROTOCOL_MAP[i.lagg_protocol],
                    'ports': [m.int_interface for m in i.lagg_interfacemembers_set.all()]
                },
                'capabilities': {
                    'add': [],
                    'del': []
                }
            })

        # Migrate IP configuration
        autoconfigure = True
        for i in orm.Interfaces.objects.all():
            autoconfigure = False
            aliases = []
            iface = ds.get_by_id('network.interfaces', i.int_interface)
            if not iface:
                iface = {
                    'enabled': True,
                }

            iface.update({
                'name': i.int_name,
                'dhcp': i.int_dhcp,
                'aliases': aliases
            })

            if i.int_ipv4address:
                aliases.append({
                    'type': 'INET',
                    'address': str(i.int_ipv4address),
                    'netmask': int(i.int_v4netmaskbit)
                })

            if i.int_ipv6address:
                aliases.append({
                    'type': 'INET6',
                    'address': str(i.int_ipv6address),
                    'netmask': int(i.int_v6netmaskbit)
                })

            for alias in i.alias_set.all():
                if alias.alias_v4address:
                    aliases.append({
                        'type': 'INET',
                        'address': str(alias.alias_v4address),
                        'netmask': int(alias.alias_v4netmaskbit)
                    })

                if alias.alias_v6address:
                    aliases.append({
                        'type': 'INET6',
                        'address': str(alias.alias_v6address),
                        'netmask': int(alias.alias_v6netmaskbit)
                    })

            m = re.search(r'mtu (\d+)', i.int_options)
            if m:
                iface['mtu'] = int(m.group(1))

            m = re.search(r'media (\w+)', i.int_options)
            if m:
                iface['media'] = m.group(1)

            m = re.search(r'mediaopt (\w+)', i.int_options)
            if m:
                opt = m.group(1)
                if opt in MEDIAOPT_MAP:
                    iface['mediaopts'] = [MEDIAOPT_MAP[opt]]

            # Try to read capabilities
            for k, v in CAPABILITY_MAP.items():
                if '-{0}'.format(k) in i.int_options:
                    l = iface.setdefault('capabilities', {}).setdefault('del', [])
                    l += v
                elif k in i.int_options:
                    l = iface.setdefault('capabilities', {}).setdefault('add', [])
                    l += v

            ds.upsert('network.interfaces', i.int_interface, iface)

        # If there are no interfaces, let it autoconfigure
        cs.set('network.autoconfigure', autoconfigure)

        # Migrate static routes
        for i in orm.StaticRoute.objects.all():
            try:
                net = ipaddress.ip_network(i.sr_destination)
            except ValueError as e:
                print("Invalid network {0}: {1}".format(i.sr_destination, e))
                continue
            ds.insert('network.routes', {
                'network': str(net.network_address),
                'netmask': net.prefixlen,
                'gateway': i.sr_gateway,
                'type': 'INET'
            })

        ds.collection_record_migration('network.interfaces', 'freenas9_migration')
        ds.collection_record_migration('network.routes', 'freenas9_migration')
        ds.collection_record_migration('network.hosts', 'freenas9_migration')
Exemplo n.º 2
0
    def forwards(self, orm):
        ds = get_datastore()
        cs = ConfigStore(ds)

        # Migrate global network configuration
        globalconf = orm.GlobalConfiguration.objects.order_by("-id")[0]
        cs.set('system.hostname',
               globalconf.gc_hostname + '.' + globalconf.gc_domain)
        cs.set('network.gateway.ipv4', globalconf.gc_ipv4gateway or None)
        cs.set('network.gateway.ipv6', globalconf.gc_ipv6gateway or None)
        cs.set('network.http_proxy', globalconf.gc_httpproxy or None)
        cs.set(
            'network.dns.addresses',
            list(
                filter(None, [
                    globalconf.gc_nameserver1 or None,
                    globalconf.gc_nameserver2 or None,
                    globalconf.gc_nameserver3 or None,
                ])))

        cs.set('network.netwait.enable', globalconf.gc_netwait_enabled)
        cs.set('network.netwait.addresses', globalconf.gc_netwait_ip.split())

        old_hosts = []
        # Migrate hosts database
        for line in globalconf.gc_hosts.split('\n'):
            line = line.strip()
            if not line:
                continue

            ip, *names = line.split(' ')
            old_hosts.extend([{
                'id': name,
                'addresses': [ip]
            } for name in names])

        ensure_unique(ds, ('network.hosts', 'id'),
                      old_ids=[x['id'] for x in old_hosts])
        for host in old_hosts:
            ds.insert('network.hosts', host)

        # Migrate VLAN interfaces configuration
        for unit, i in enumerate(orm.VLAN.objects.all()):
            ds.insert(
                'network.interfaces', {
                    'id': 'vlan{0}'.format(unit),
                    'name': None,
                    'type': 'VLAN',
                    'cloned': True,
                    'enabled': True,
                    'dhcp': None,
                    'rtadv': False,
                    'noipv6': False,
                    'mtu': None,
                    'media': None,
                    'mediaopts': [],
                    'aliases': [],
                    'vlan': {
                        'parent': i.vlan_pint,
                        'tag': i.vlan_tag
                    },
                    'capabilities': {
                        'add': [],
                        'del': []
                    }
                })

        # Migrate LAGG interfaces configuration
        for unit, i in enumerate(orm.LAGGInterface.objects.all()):
            ds.insert(
                'network.interfaces', {
                    'id': 'lagg{0}'.format(unit),
                    'name': None,
                    'type': 'LAGG',
                    'cloned': True,
                    'enabled': True,
                    'dhcp': None,
                    'rtadv': False,
                    'noipv6': False,
                    'mtu': None,
                    'media': None,
                    'mediaopts': [],
                    'aliases': [],
                    'lagg': {
                        'protocol':
                        LAGG_PROTOCOL_MAP[i.lagg_protocol],
                        'ports': [
                            m.int_interface
                            for m in i.lagg_interfacemembers_set.all()
                        ]
                    },
                    'capabilities': {
                        'add': [],
                        'del': []
                    }
                })

        # Migrate IP configuration
        autoconfigure = True
        for i in orm.Interfaces.objects.all():
            autoconfigure = False
            aliases = []
            iface = ds.get_by_id('network.interfaces', i.int_interface)
            if not iface:
                iface = {
                    'enabled': True,
                }

            iface.update({
                'name': i.int_name,
                'dhcp': i.int_dhcp,
                'aliases': aliases
            })

            if i.int_ipv4address:
                aliases.append({
                    'type': 'INET',
                    'address': str(i.int_ipv4address),
                    'netmask': int(i.int_v4netmaskbit)
                })

            if i.int_ipv6address:
                aliases.append({
                    'type': 'INET6',
                    'address': str(i.int_ipv6address),
                    'netmask': int(i.int_v6netmaskbit)
                })

            for alias in i.alias_set.all():
                if alias.alias_v4address:
                    aliases.append({
                        'type': 'INET',
                        'address': str(alias.alias_v4address),
                        'netmask': int(alias.alias_v4netmaskbit)
                    })

                if alias.alias_v6address:
                    aliases.append({
                        'type': 'INET6',
                        'address': str(alias.alias_v6address),
                        'netmask': int(alias.alias_v6netmaskbit)
                    })

            m = re.search(r'mtu (\d+)', i.int_options)
            if m:
                iface['mtu'] = int(m.group(1))

            m = re.search(r'media (\w+)', i.int_options)
            if m:
                iface['media'] = m.group(1)

            m = re.search(r'mediaopt (\w+)', i.int_options)
            if m:
                opt = m.group(1)
                if opt in MEDIAOPT_MAP:
                    iface['mediaopts'] = [MEDIAOPT_MAP[opt]]

            # Try to read capabilities
            for k, v in CAPABILITY_MAP.items():
                if '-{0}'.format(k) in i.int_options:
                    l = iface.setdefault('capabilities',
                                         {}).setdefault('del', [])
                    l += v
                elif k in i.int_options:
                    l = iface.setdefault('capabilities',
                                         {}).setdefault('add', [])
                    l += v

            ds.upsert('network.interfaces', i.int_interface, iface)

        # If there are no interfaces, let it autoconfigure
        cs.set('network.autoconfigure', autoconfigure)

        # Migrate static routes
        for i in orm.StaticRoute.objects.all():
            try:
                net = ipaddress.ip_network(i.sr_destination)
            except ValueError as e:
                print("Invalid network {0}: {1}".format(i.sr_destination, e))
                continue
            ds.insert(
                'network.routes', {
                    'network': str(net.network_address),
                    'netmask': net.prefixlen,
                    'gateway': i.sr_gateway,
                    'type': 'INET'
                })

        ds.collection_record_migration('network.interfaces',
                                       'freenas9_migration')
        ds.collection_record_migration('network.routes', 'freenas9_migration')
        ds.collection_record_migration('network.hosts', 'freenas9_migration')
Exemplo n.º 3
0
    def forwards(self, orm):
        # Skip for install time, we only care for upgrades here
        if 'FREENAS_INSTALL' in os.environ:
            return

        ds = get_datastore()

        # First ensure that no duplicate object is present between the two databses
        # This call will raise an error if a dup is found and will not proceed
        ensure_unique(ds, ('groups', 'gid'),
                      orm_handle=orm,
                      orm_tuple=('account.bsdGroups', 'bsdgrp_gid'),
                      orm_query=Q(bsdgrp_builtin=False))

        ensure_unique(ds, ('users', 'uid'),
                      orm_handle=orm,
                      orm_tuple=('account.bsdUsers', 'bsdusr_uid'),
                      orm_query=Q(bsdusr_builtin=False))

        # get all non-builtin groups
        for g in orm['account.bsdGroups'].objects.filter(bsdgrp_builtin=False):
            ds.insert(
                'groups', {
                    'id': str(uuid.uuid4()),
                    'gid': g.bsdgrp_gid,
                    'builtin': g.bsdgrp_builtin,
                    'sudo': g.bsdgrp_sudo,
                    'name': g.bsdgrp_group
                })

        for u in orm['account.bsdUsers'].objects.filter(
                Q(bsdusr_builtin=False) | Q(bsdusr_uid=0)):
            groups = []
            for bgm in orm['account.bsdGroupMembership'].objects.filter(
                    bsdgrpmember_user=u):
                grp = ds.query('groups',
                               ('gid', '=', bgm.bsdgrpmember_group.bsdgrp_gid),
                               single=True)
                if not grp:
                    continue

                groups.append(grp['id'])

            grp = ds.query('groups', ('gid', '=', u.bsdusr_group.bsdgrp_gid),
                           single=True)
            user_uuid = ds.query('users', ('uid', '=', u.bsdusr_uid),
                                 single=True)
            user_uuid = user_uuid['id'] if user_uuid else str(uuid.uuid4())
            user = {
                'id': user_uuid,
                'uid': u.bsdusr_uid,
                'password_disabled': u.bsdusr_password_disabled,
                'email': u.bsdusr_email,
                'group': grp['id'] if grp else NOGROUP_ID,
                'home': u.bsdusr_home,
                'full_name': u.bsdusr_full_name,
                'username': u.bsdusr_username,
                'sshpubkey': bsdusr_sshpubkey(u),
                'shell': u.bsdusr_shell,
                'locked': u.bsdusr_locked,
                'unixhash': u.bsdusr_unixhash,
                'sudo': u.bsdusr_sudo,
                'groups': groups,
                'attributes': {},
                'builtin': u.bsdusr_builtin
            }

            convert_smbhash(user, u.bsdusr_smbhash)
            ds.upsert('users', user_uuid, user)

        ds.collection_record_migration('groups', 'freenas9_migration')
        ds.collection_record_migration('users', 'freenas9_migration')
Exemplo n.º 4
0
    def forwards(self, orm):
        # Skip for install time, we only care for upgrades here
        if 'FREENAS_INSTALL' in os.environ:
            return

        ds = get_datastore()

        # First ensure that no duplicate object is present between the two databses
        # This call will raise an error if a dup is found and will not proceed
        ensure_unique(
            ds,
            ('groups', 'gid'),
            orm_handle=orm,
            orm_tuple=('account.bsdGroups', 'bsdgrp_gid'),
            orm_query=Q(bsdgrp_builtin=False)
        )

        ensure_unique(
            ds,
            ('users', 'uid'),
            orm_handle=orm,
            orm_tuple=('account.bsdUsers', 'bsdusr_uid'),
            orm_query=Q(bsdusr_builtin=False)
        )

        # get all non-builtin groups
        for g in orm['account.bsdGroups'].objects.filter(bsdgrp_builtin=False):
            ds.insert('groups', {
                'id': str(uuid.uuid4()),
                'gid': g.bsdgrp_gid,
                'builtin': g.bsdgrp_builtin,
                'sudo': g.bsdgrp_sudo,
                'name': g.bsdgrp_group
            })

        for u in orm['account.bsdUsers'].objects.filter(
            Q(bsdusr_builtin=False) | Q(bsdusr_uid=0)
        ):
            groups = []
            for bgm in orm['account.bsdGroupMembership'].objects.filter(bsdgrpmember_user=u):
                grp = ds.query(
                    'groups', ('gid', '=', bgm.bsdgrpmember_group.bsdgrp_gid), single=True
                )
                if not grp:
                    continue

                groups.append(grp['id'])

            grp = ds.query('groups', ('gid', '=', u.bsdusr_group.bsdgrp_gid), single=True)
            user_uuid = ds.query('users', ('uid', '=', u.bsdusr_uid), single=True)
            user_uuid = user_uuid['id'] if user_uuid else str(uuid.uuid4())
            user = {
                'id': user_uuid,
                'uid': u.bsdusr_uid,
                'password_disabled': u.bsdusr_password_disabled,
                'email': u.bsdusr_email,
                'group': grp['id'] if grp else NOGROUP_ID,
                'home': u.bsdusr_home,
                'full_name': u.bsdusr_full_name,
                'username': u.bsdusr_username,
                'sshpubkey': bsdusr_sshpubkey(u),
                'shell': u.bsdusr_shell,
                'locked': u.bsdusr_locked,
                'unixhash': u.bsdusr_unixhash,
                'sudo': u.bsdusr_sudo,
                'groups': groups,
                'attributes': {},
                'builtin': u.bsdusr_builtin
            }

            convert_smbhash(user, u.bsdusr_smbhash)
            ds.upsert('users', user_uuid, user)

        ds.collection_record_migration('groups', 'freenas9_migration')
        ds.collection_record_migration('users', 'freenas9_migration')