Problem:UCS@school - Internal Server Error when Assigning Computers in “Manage Computer Rooms”

Problem

When creating or modifying computer rooms via Manage Computer Rooms in the Univention Management Console (UMC), saving fails with an internal server error.

The following traceback is shown:

Interner Server-Fehler in "schoolrooms/put".
Request: schoolrooms/put

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/univention/management/console/base.py", line 388, in __error_handling
    six.reraise(etype, exc, etraceback)
  File "/usr/lib/python3/dist-packages/six.py", line 693, in reraise
    raise value
  File "/usr/lib/python3/dist-packages/univention/management/console/base.py", line 285, in execute
    function.__func__(self, request, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/univention/management/console/modules/decorators.py", line 189, in _response
    return function(self, request)
  File "/usr/lib/python3/dist-packages/ucsschool/lib/school_umc_ldap_connection.py", line 156, in wrapper_func
    return func(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/univention/management/console/modules/schoolrooms/__init__.py", line 151, in put
    ldap_user_write,
  File "/usr/lib/python3/dist-packages/univention/management/console/modules/schoolrooms/__init__.py", line 193, in _set_teacher_computers
    computer.modify(ldap_user_write)
  File "/usr/lib/python3/dist-packages/ucsschool/lib/models/base.py", line 619, in modify
    success = self.modify_without_hooks(lo, validate, move_if_necessary)
  File "/usr/lib/python3/dist-packages/ucsschool/lib/models/computer.py", line 308, in modify_without_hooks
    self.create_network(lo)
  File "/usr/lib/python3/dist-packages/ucsschool/lib/models/computer.py", line 342, in create_network
    network.create(lo)
  File "/usr/lib/python3/dist-packages/ucsschool/lib/models/base.py", line 552, in create
    success = self.create_without_hooks(lo, validate)
  File "/usr/lib/python3/dist-packages/ucsschool/lib/models/network.py", line 69, in create_without_hooks
    dns_reverse_zone.create(lo)
  File "/usr/lib/python3/dist-packages/ucsschool/lib/models/base.py", line 552, in create
    success = self.create_without_hooks(lo, validate)
  File "/usr/lib/python3/dist-packages/ucsschool/lib/models/base.py", line 567, in create_without_hooks
    raise ValidationError(self.errors.copy())
ucsschool.lib.models.attributes.ValidationError: {'name': ['Ein Subnetz für den Reverse Lookup besteht aus den ersten 1 bis 3 Oktetten einer IPv4-Adresse (z.B. "192.168.0") oder den ersten 1 bis 31 Nibbles einer vollständigen (mit führenden Nullen und ohne die ::-Ersetzung) IPv6-Adresse (z.B. "2001:0db8:010" für "2001:db8:100::/44").']}

Root Cause

:beetle: Known Bug 51846

The error originates from the put method in the schoolrooms module and occurs during the modification of computer objects. Specifically, it fails in:

ucsschool.lib.models.computer.create_network()

Due to dns_reverse_zone.create() validation logic.

If the computer object has no valid network assigned, the method raises a ValidationError. The system expects:

IPv4: a subnet in the form X.X.X

IPv6: a full address prefix of 1–31 nibbles (e.g., 2001:0db8:010)

Any value outside these constraints (including None) will halt the operation.


Debugging Instructions

1: Increase Debug Logging

ucr set umc/module/debug/level=4

2: Restart UMC Server

systemctl restart univention-management-console-server.service

3: Review Logs

Check detailed logs at:

/var/log/univention/management-console-module-schoolrooms.log

Look for errors related to create_network, dns_reverse_zone.create, or missing network attributes.


Solution

1. Use a filtered list to extract potentially affected computers without network assignment.

udm computers/windows list --filter '(!(network=*))' | less

Example:

(!(network=*))
DN: cn=WIN10-CLIENT-01,cn=computers,ou=mejneschool2,dc=ucs5schoolhejne,dc=intranet
  description: None
  domain: None
  fqdn: None
  groups: cn=Windows Hosts,cn=groups,dc=ucs5schoolhejne,dc=intranet
  groups: cn=mejneschool2-Raum-Mejne2,cn=raeume,cn=groups,ou=mejneschool2,dc=ucs5schoolhejne,dc=intranet
  inventory-number: None
  inventoryNumber: 01
  mac: 52:54:00:0a:15:02
  name: WIN10-CLIENT-01
  network: None
  networkAccess: 1
  ntCompatibility: None
  operatingSystem: Windows 10 Pro
  operatingSystemVersion: 10.0 (19045)
  primaryGroup: cn=Windows Hosts,cn=groups,dc=ucs5schoolhejne,dc=intranet
  sambaRID: 6470
  serial-number: None
  shell: /bin/false
  ucsschoolRole: win_computer:school:mejneschool2
  ucsschoolRole: teacher_computer:school:mejneschool2
  unixhome: /dev/null

2. List networks

You will need the DN from the network you want to set for the object.

udm networks/network list | less

Example:

DN: cn=mejneschool2-10.200.30.0,cn=networks,ou=mejneschool2,dc=ucs5schoolhejne,dc=intranet
  dhcpEntryZone: cn=mejneschool2,cn=dhcp,ou=mejneschool2,dc=ucs5schoolhejne,dc=intranet
  dnsEntryZoneForward: zoneName=ucs5schoolhejne.intranet,cn=dns,dc=ucs5schoolhejne,dc=intranet
  dnsEntryZoneReverse: zoneName=30.200.10.in-addr.arpa,cn=dns,dc=ucs5schoolhejne,dc=intranet
  name: mejneschool2-10.200.30.0
  netmask: 24
  network: 10.200.30.0
  nextIp: 10.200.30.3

3. Use a loop to assign a correct network object. Replace placeholders with your pseudonymized values as needed:

udm computers/windows list --filter '(!(network=*))' | \
  grep '^DN: ' | \
  while read -r line; do
    DN=$(echo "$line" | sed 's/^DN: //')
    HOSTNAME=$(udm computers/windows list --dn "$DN" | grep '^  name: ' | awk '{print $2}')
    echo "Network is set correctly for:" 
    echo "$HOSTNAME"
    udm computers/windows modify \
      --dn "$DN" \
      --set network="cn=mejneschool2-10.200.30.0,cn=networks,ou=mejneschool2,dc=ucs5schoolhejne,dc=intranet"
done

Example:

Network is set correctly for:
WIN10-CLIENT-02
WIN10-CLIENT-03
WIN10-CLIENT-01
WIN11-CLIENT-05
Object modified: cn=WIN10-CLIENT-01,cn=computers,ou=mejneschool2,dc=ucs5schoolhejne,dc=intranet

This assigns the correct reverse lookup-compatible subnet for affected computers and solve the problem.

Example:

udm computers/windows list --filter cn=WIN10-Client-01

DN: cn=WIN10-CLIENT-01,cn=computers,ou=mejneschool2,dc=ucs5schoolhejne,dc=intranet
  description: None
  dhcpEntryZone: cn=mejneschool2,cn=dhcp,ou=mejneschool2,dc=ucs5schoolhejne,dc=intranet 10.200.30.4 52:54:00:0a:15:02
  dnsEntryZoneForward: zoneName=ucs5schoolhejne.intranet,cn=dns,dc=ucs5schoolhejne,dc=intranet 10.200.30.4
  dnsEntryZoneReverse: zoneName=30.200.10.in-addr.arpa,cn=dns,dc=ucs5schoolhejne,dc=intranet 10.200.30.4
  domain: ucs5schoolhejne.intranet
  fqdn: WIN10-CLIENT-01.ucs5schoolhejne.intranet
  groups: cn=Windows Hosts,cn=groups,dc=ucs5schoolhejne,dc=intranet
  groups: cn=mejneschool2-Raum-Mejne2,cn=raeume,cn=groups,ou=mejneschool2,dc=ucs5schoolhejne,dc=intranet
  inventory-number: None
  inventoryNumber: 01
  ip: 10.200.30.4
  mac: 52:54:00:0a:15:02
  name: WIN10-CLIENT-01
  network: cn=mejneschool2-10.200.30.0,cn=networks,ou=mejneschool2,dc=ucs5schoolhejne,dc=intranet
  networkAccess: 1
  ntCompatibility: None
  operatingSystem: Windows 10 Pro
  operatingSystemVersion: 10.0 (19045)
  primaryGroup: cn=Windows Hosts,cn=groups,dc=ucs5schoolhejne,dc=intranet
  sambaRID: 6470
  serial-number: None
  shell: /bin/false
  ucsschoolRole: win_computer:school:mejneschool2
  ucsschoolRole: teacher_computer:school:mejneschool2
  unixhome: /dev/null

(Optional) Change the IP Address

udm computers/windows modify --dn 'cn=WIN10-CLIENT-01,cn=computers,ou=mejneschool2,dc=ucs5schoolhejne,dc=intranet' --set ip=10.200.30.31

Object modified: cn=WIN10-CLIENT-01,cn=computers,ou=mejneschool2,dc=ucs5schoolhejne,dc=intranet
cn=WIN10-Client-01
DN: cn=WIN10-CLIENT-01,cn=computers,ou=mejneschool2,dc=ucs5schoolhejne,dc=intranet
  description: None
  dhcpEntryZone: cn=mejneschool2,cn=dhcp,ou=mejneschool2,dc=ucs5schoolhejne,dc=intranet 10.200.30.31 52:54:00:0a:15:02
  dnsEntryZoneForward: zoneName=ucs5schoolhejne.intranet,cn=dns,dc=ucs5schoolhejne,dc=intranet 10.200.30.31
  dnsEntryZoneReverse: zoneName=30.200.10.in-addr.arpa,cn=dns,dc=ucs5schoolhejne,dc=intranet 10.200.30.31
  domain: ucs5schoolhejne.intranet
  fqdn: WIN10-CLIENT-01.ucs5schoolhejne.intranet
  groups: cn=Windows Hosts,cn=groups,dc=ucs5schoolhejne,dc=intranet
  groups: cn=mejneschool2-Raum-Mejne2,cn=raeume,cn=groups,ou=mejneschool2,dc=ucs5schoolhejne,dc=intranet
  inventory-number: None
  inventoryNumber: 01
  ip: 10.200.30.31
  mac: 52:54:00:0a:15:02
  name: WIN10-CLIENT-01
  network: cn=mejneschool2-10.200.30.0,cn=networks,ou=mejneschool2,dc=ucs5schoolhejne,dc=intranet
  networkAccess: 1
  ntCompatibility: None
  operatingSystem: Windows 10 Pro
  operatingSystemVersion: 10.0 (19045)
  primaryGroup: cn=Windows Hosts,cn=groups,dc=ucs5schoolhejne,dc=intranet
  sambaRID: 6470
  serial-number: None
  shell: /bin/false
  ucsschoolRole: win_computer:school:mejneschool2
  ucsschoolRole: teacher_computer:school:mejneschool2
  unixhome: /dev/null