diff --git a/frontend/templates/frontend/login.html b/frontend/templates/frontend/login.html
index 618bff1..563720a 100644
--- a/frontend/templates/frontend/login.html
+++ b/frontend/templates/frontend/login.html
@@ -1,4 +1,5 @@
+
{% extends 'frontend/base.html' %}
{% block title %} - Login{% endblock %}
@@ -9,6 +10,7 @@
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/lib/mikrotik.py b/lib/mikrotik.py
index 1ae2bd1..38f9a6f 100644
--- a/lib/mikrotik.py
+++ b/lib/mikrotik.py
@@ -360,20 +360,45 @@ class MikrotikModelMixin(RoutedModelAbstract):
def sync_from_mikrotik(classname):
+ to_delete = []
_st = classname()
for i in _st.router_get_all:
i = {k.replace('-', '_'): v for k, v in i.items()}
try:
- existing = classname.objects.get(id=i['id'])
+ existing = list(classname.objects.filter(id=i['id']))
+ if not existing:
+ raise ValueError("Empty")
+
+ _to_delete = []
+ if len(existing) > 1:
+ _to_delete = [a.internal_id for a in existing]
+ for e in existing:
+ if e.active_address:
+ existing = [e]
+ break
+
+
+ _logger.error(f"More than 1 Entry for id {i['id']} - {existing}")
+
+ existing = existing[0]
+ if _to_delete:
+ _to_delete.remove(existing.internal_id)
+ to_delete.extend(_to_delete)
for k, v in i.items():
if hasattr(existing, k):
_logger.debug(f'Updating {k} to {v} - {existing}')
setattr(existing, k, v)
existing.save()
- except classname.DoesNotExist:
+ except (ValueError, classname.DoesNotExist):
_logger.info(f'Creating {i["id"]}')
try:
classname.objects.create(**i)
except IntegrityError as e:
_logger.error(f'Could not create {i["id"]}, already exists')
_logger.exception(e)
+ if to_delete:
+ deletions = classname.objects.filter(internal_id__in=to_delete)
+ _logger.warning(f"Delete {classname} items {deletions}")
+ # deletions.delete()
+
+
diff --git a/manager/admin.py b/manager/admin.py
index 2c876c1..36aa5d1 100644
--- a/manager/admin.py
+++ b/manager/admin.py
@@ -56,11 +56,22 @@ def resync_all(*args, **kwargs):
container[hwaddr].lease = lease
container[hwaddr].save()
elif lxc:
- DevContainer.objects.create(
- dns=dns,
- lease=lease,
- lxc=lxc,
- )
+ try:
+ DevContainer.objects.create(
+ dns=dns,
+ lease=lease,
+ lxc=lxc,
+ )
+ except Exception as e:
+ logging.error(e)
+ if 'dns_id' in str(e):
+ existing = DevContainer.objects.get(dns=dns)
+ existing.lease=lease
+ existing.lxc = lxc
+ existing.save()
+ else:
+ raise e
+
# Now remove the non lxc devcontainers
DevContainer.objects.filter(lxc__isnull=True).delete()
diff --git a/manager/models.py b/manager/models.py
index f97ad16..deb7b1f 100644
--- a/manager/models.py
+++ b/manager/models.py
@@ -449,7 +449,10 @@ class DevContainer(BaseModel, SearchableMixin, TaskAwareModelMixin):
self.lease.mac_address = self.lxc.hwaddr
self.lease.save()
- super().save(*args, **kwargs)
+ try:
+ super().save(*args, **kwargs)
+ except Exception as e:
+ logging.error(e)
def __str__(self):
return f"{self.name} ({self.address})"