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')
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')
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')
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')