Changeset 6431
- Timestamp:
- Dec 10, 2008, 3:32:29 PM (16 years ago)
- Location:
- trunk
- Files:
-
- 1 deleted
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Makefile
r6424 r6431 10 10 #Setup environment database 11 11 @./bin/buildout 12 @echo "no" | ./bin/django syncdb 13 14 syncdb: 15 # syncdatabase 12 16 @echo "no" | ./bin/django syncdb 13 17 -
trunk/exodus/admin.py
r6427 r6431 1 1 from django.contrib.admin.sites import AdminSite 2 from django.contrib import admin 2 3 from django.contrib import databrowse 3 4 from django import forms … … 9 10 plain_admin = AdminSite() 10 11 11 class PublicAPInline(admin.TabularInline):12 model = PublicAP13 extra = 112 #class PublicAPInline(admin.TabularInline): 13 # model = PublicAP 14 # extra = 1 14 15 15 16 class InterfaceInline(admin.TabularInline): … … 52 53 advanced_admin.register(Node, NodeAdmin) 53 54 advanced_admin.register(Interface) 54 advanced_admin.register(PublicAP)55 #advanced_admin.register(PublicAP) 55 56 advanced_admin.register(DhcpStatic) 56 57 … … 61 62 plain_admin.register(Node) 62 63 plain_admin.register(Interface) 63 plain_admin.register(PublicAP)64 #plain_admin.register(PublicAP) 64 65 plain_admin.register(DhcpStatic) 65 66 66 67 databrowse.site.register(Antenna) 67 databrowse.site.register(Location , LocationAdmin)68 databrowse.site.register(Location) 68 69 databrowse.site.register(DnsServer) 69 70 databrowse.site.register(Network) 70 71 databrowse.site.register(Node) 71 72 databrowse.site.register(Interface) 72 databrowse.site.register(PublicAP)73 #databrowse.site.register(PublicAP) 73 74 databrowse.site.register(DhcpStatic) -
trunk/exodus/models.py
r6429 r6431 101 101 102 102 class Interface(models.Model): 103 node = models.ForeignKey(Node)104 type = models.CharField(max_length=10, choices=INTERFACE_TYPE_CHOICES, \103 node = models.ForeignKey(Node) 104 type = models.CharField(max_length=10, choices=INTERFACE_TYPE_CHOICES, 105 105 default='eth') 106 iface = models.CharField(max_length=10, verbose_name="interface", \106 iface = models.CharField(max_length=10, verbose_name="interface", 107 107 default='eth0') 108 ip = models.IPAddressField(unique=True, blank=True) 109 netmask = models.IntegerField(default=30) 110 polar = models.CharField(blank=True, max_length=10, choices=POLAR_CHOICES) 111 ssid = models.CharField(max_length=50, blank=True, null=True) 112 mode = models.CharField(max_length=10, choices=WIFI_MODE_CHOICES, blank=True) 113 channel = models.IntegerField(blank=True, null=True) 114 antenna = models.ForeignKey(Antenna, blank=True, null=True) 115 shortdesc = models.CharField(blank=True, max_length=10) 116 desc = models.CharField(blank=True, max_length=100) 117 link = models.ForeignKey('self', blank=True, null=True) 108 ip = models.IPAddressField(unique=True, blank=True) 109 netmask = models.IntegerField(default=30) 110 polar = models.CharField(blank=True, max_length=10, choices=POLAR_CHOICES) 111 ssid = models.CharField(max_length=50, blank=True, null=True) 112 mode = models.CharField(max_length=10, choices=WIFI_MODE_CHOICES, 113 blank=True) 114 channel = models.IntegerField(blank=True, null=True) 115 antenna = models.ForeignKey(Antenna, blank=True, null=True) 116 shortdesc = models.CharField(blank=True, max_length=10) 117 desc = models.CharField(blank=True, max_length=100) 118 link = models.ForeignKey('self', blank=True, null=True) 119 accesspoint = models.BooleanField() 118 120 119 class Meta:120 #unique_together = ('node', 'iface')121 verbose_name = 'Interface'121 class Meta: 122 #unique_together = ('node', 'iface') 123 verbose_name = 'Interface' 122 124 123 def __unicode__(self):124 return "%s/%s" % (self.node, self.iface)125 def __unicode__(self): 126 return "%s/%s" % (self.node, self.iface) 125 127 126 128 # … … 128 130 # this feature as we going to use a new interlink IP naming model 129 131 class InterfaceAlias(models.Model): 130 iface = models.ForeignKey(Interface,related_name='child')131 ip = models.IPAddressField(unique=True)132 netmask = models.IntegerField(default=30)133 shortdesc = models.CharField(blank=True, max_length=10)134 desc = models.CharField(blank=True, max_length=100)135 linkAlias = models.ForeignKey('self', blank=True, null=True)136 link = models.ForeignKey(Interface, blank=True, null=True)132 iface = models.ForeignKey(Interface,related_name='child') 133 ip = models.IPAddressField(unique=True) 134 netmask = models.IntegerField(default=30) 135 shortdesc = models.CharField(blank=True, max_length=10) 136 desc = models.CharField(blank=True, max_length=100) 137 linkAlias = models.ForeignKey('self', blank=True, null=True) 138 link = models.ForeignKey(Interface, blank=True, null=True) 137 139 138 def __unicode__(self):139 return "Alias %s" % (self.iface)140 def __unicode__(self): 141 return "Alias %s" % (self.iface) 140 142 141 143 # … … 144 146 # be defined, all other could be calculated on the fly if needed 145 147 146 class PublicAP(models.Model):147 iface = models.ForeignKey(Interface,related_name='ap', verbose_name="interface")148 ip = models.IPAddressField(unique=True)149 netmask = models.IntegerField(default=28)150 dhcpstart = models.IPAddressField()151 dhcpstop = models.IPAddressField()152 shortdesc = models.CharField(max_length=10)153 desc = models.CharField(max_length=100)154 155 class Meta:156 verbose_name = "Public Access Point"157 158 def __unicode__(self):159 return "%s:%s" % (self.iface,self.pk)148 #class PublicAP(models.Model): 149 # iface = models.ForeignKey(Interface,related_name='ap', verbose_name="interface") 150 # ip = models.IPAddressField(unique=True) 151 # netmask = models.IntegerField(default=28) 152 # dhcpstart = models.IPAddressField() 153 # dhcpstop = models.IPAddressField() 154 # shortdesc = models.CharField(max_length=10) 155 # desc = models.CharField(max_length=100) 156 # 157 # class Meta: 158 # verbose_name = "Public Access Point" 159 # 160 # def __unicode__(self): 161 # return "%s:%s" % (self.iface,self.pk) 160 162 161 163 class DhcpStatic(models.Model): … … 163 165 macaddress = models.CharField(max_length=17) 164 166 address = models.IPAddressField() 165 PublicAP = models.ForeignKey( PublicAP)167 PublicAP = models.ForeignKey(Interface) 166 168 167 169 class Meta: -
trunk/exodus/settings.py
r6366 r6431 38 38 LANGUAGE_CODE = 'en-us' 39 39 40 SITE_ID = 141 42 40 # Make this unique, and don't share it with anybody. 43 41 SECRET_KEY = 'l+plhHJKNIkiasdfh12lsk0Lkf,.=+-asdjdknmnaladfasdmnm,90934jknmnsdaf09' … … 68 66 'django.contrib.contenttypes', 69 67 'django.contrib.sessions', 70 'django.contrib.sites',71 68 'django.contrib.admin', 72 69 'django.contrib.databrowse', -
trunk/exodus/templates/viewNode.html
r6424 r6431 23 23 <div style="border:1px solid #000000;"> 24 24 <h3>iface: {{ nic.iface }} </h3> 25 <a href="{% url exodus.views.genericPublicAP "add" node.name nic.iface "new" %}">Add new public access point</a><p />26 25 Description: {{ nic.shortdesc }} <br> 27 26 IP: {{ nic.ip }}/{{ nic.netmask }}<br /> … … 50 49 {% endfor %} 51 50 <ol> 52 {% for accessPoint in nic.ap.all %}53 <div style="border:1px solid #000000;">54 <p />55 <li>Public Access Point: {{ accessPoint.ip}}/{{accessPoint.netmask }}56 <a href="{% url exodus.views.genericPublicAP "edit" node.name nic.iface accessPoint.pk %}">EDIT</a>57 <a href="{% url exodus.views.genericPublicAP "delete" node.name nic.iface accessPoint.pk %}">DELETE</a>58 {% for dhcp in accessPoint.dhcpstatic.all %}59 <ul>60 <li>Hostname: {{ dhcp.hostname }} </li>61 <li>MacAddress: {{ dhcp.macaddress }} </li>62 </ul>63 {% endfor %}64 </li>65 <p />66 </div>67 {% endfor %}68 51 </ol> 69 52 </div> -
trunk/exodus/urls.py
r6426 r6431 22 22 (r'^(?P<mode>(add|edit|delete))/node/(?P<node>.+)/$', 'exodus.views.genericNode'), 23 23 (r'^(?P<mode>(add|edit|delete))/nic/(?P<node>.+)/(?P<interface>.+)/$', 'exodus.views.genericInterface'), 24 (r'^(?P<mode>(add|edit|delete))/dhcp/(?P<node>.+)/(?P<interface>.+)/(?P<publicAP>.+)/$', 'exodus.views.genericPublicAP'),24 #(r'^(?P<mode>(add|edit|delete))/dhcp/(?P<node>.+)/(?P<interface>.+)/(?P<publicAP>.+)/$', 'exodus.views.genericPublicAP'), 25 25 (r'^(?P<mode>(add|edit|delete))/(?P<model>.+)/(?P<object>.+)/$', 'exodus.views.genericModel'), 26 26 -
trunk/exodus/views.py
r6430 r6431 9 9 from exodus.models import * 10 10 from exodus.wllogic import free_masterip, newSSIDName, addInterlinkIP, \ 11 freeInterlinkIP , freePublicAPIP11 freeInterlinkIP 12 12 13 13 from exodus.utils import pdebug … … 128 128 # 129 129 # PublicAP 130 class PublicAPForm(forms.ModelForm):131 class Meta:132 model = PublicAP133 exclude = ('shortdesc', 'desc', 'ip', 'dhcpstart', 'dhcpstop')134 135 class PublicAPHandler(GenericHandler):136 137 def __init__(self, request, node, interface, publicAP, mode):138 pdebug(100, "Function: PublicAPHandler.__init__")139 self.node = Node.objects.get(name=node)140 self.interface = Interface.objects.get(node=self.node, iface=interface)141 if mode == 'add':142 self.publicAP = PublicAP(iface=self.interface)143 else:144 self.publicAP = PublicAP.objects.get(iface=self.interface, \145 pk=publicAP)146 super(PublicAPHandler, self).__init__(request, mode)147 148 def _add(self):149 pdebug(100, "Function: PublicAPHandler._add")150 _instance = self.form.save(commit=False)151 # Find IP range inside interface range with disired size/subnet152 _instance.ip = freePublicAPIP(_instance.iface, _instance.netmask)153 _instance.dhcpstart = 1154 _instance.dhcpstop = 2155 # If wireless generate ssid name156 _instance.ssid = newSSIDName(_instance.iface.node, _instance.iface, \157 'omni')158 _instance.save()159 160 def genericPublicAP(request, node, interface, publicAP, mode):161 pdebug(100, "Function: genericPublicAP")162 handler = PublicAPHandler(request, node, interface, publicAP, mode)163 return handler.render_to_response()164 130 #class PublicAPForm(forms.ModelForm): 131 # class Meta: 132 # model = PublicAP 133 # exclude = ('shortdesc', 'desc', 'ip', 'dhcpstart', 'dhcpstop') 134 # 135 #class PublicAPHandler(GenericHandler): 136 # 137 # def __init__(self, request, node, interface, publicAP, mode): 138 # pdebug(100, "Function: PublicAPHandler.__init__") 139 # self.node = Node.objects.get(name=node) 140 # self.interface = Interface.objects.get(node=self.node, iface=interface) 141 # if mode == 'add': 142 # self.publicAP = PublicAP(iface=self.interface) 143 # else: 144 # self.publicAP = PublicAP.objects.get(iface=self.interface, \ 145 # pk=publicAP) 146 # super(PublicAPHandler, self).__init__(request, mode) 147 # 148 # def _add(self): 149 # pdebug(100, "Function: PublicAPHandler._add") 150 # _instance = self.form.save(commit=False) 151 # # Find IP range inside interface range with disired size/subnet 152 # _instance.ip = freePublicAPIP(_instance.iface, _instance.netmask) 153 # _instance.dhcpstart = 1 154 # _instance.dhcpstop = 2 155 # # If wireless generate ssid name 156 # _instance.ssid = newSSIDName(_instance.iface.node, _instance.iface, \ 157 # 'omni') 158 # _instance.save() 159 # 160 #def genericPublicAP(request, node, interface, publicAP, mode): 161 # pdebug(100, "Function: genericPublicAP") 162 # handler = PublicAPHandler(request, node, interface, publicAP, mode) 163 # return handler.render_to_response() 164 # 165 165 # 166 166 # Interface -
trunk/exodus/wllogic.py
r6424 r6431 1 1 # (c) Roland van Laar 2 2 3 from exodus.models import Node, Interface , PublicAP3 from exodus.models import Node, Interface 4 4 from exodus.settings import MASTERIP_NETMASK 5 5 … … 84 84 # XXX: Needs merging with freeInterlinkIP as interface could have both AP, 85 85 # interlink defined on one link 86 def freePublicAPIP(masterLink, netmask):87 taken = {}88 89 for interface in Interface.objects.filter(link=masterLink):90 #Grr, needs all interfaces which are master requires a bit of a hack91 addr = network(interface.ip, interface.netmask)92 addrMax = broadcast(interface.ip, interface.netmask)93 while addr < addrMax:94 taken[addr] = 195 addr = addr + 196 97 for accessPoint in PublicAP.objects.filter(iface=masterLink):98 #Grr, needs all interfaces which are master requires a bit of a hack99 addr = network(accessPoint.ip, accessPoint.netmask)100 addrMax = broadcast(accessPoint.ip, accessPoint.netmask)101 while addr < addrMax:102 taken[addr] = 1103 addr = addr + 1104 105 #Should be dynamic based on the number of hosts in here106 size = netmask107 numaddrs = 1 << (32 - size)108 i = network(masterLink.ip,masterLink.netmask)109 while taken.has_key(i):110 i = i + numaddrs111 112 return show_addr(i)113 86 #def freePublicAPIP(masterLink, netmask): 87 # taken = {} 88 # 89 # for interface in Interface.objects.filter(link=masterLink): 90 # #Grr, needs all interfaces which are master requires a bit of a hack 91 # addr = network(interface.ip, interface.netmask) 92 # addrMax = broadcast(interface.ip, interface.netmask) 93 # while addr < addrMax: 94 # taken[addr] = 1 95 # addr = addr + 1 96 # 97 # for accessPoint in PublicAP.objects.filter(iface=masterLink): 98 # #Grr, needs all interfaces which are master requires a bit of a hack 99 # addr = network(accessPoint.ip, accessPoint.netmask) 100 # addrMax = broadcast(accessPoint.ip, accessPoint.netmask) 101 # while addr < addrMax: 102 # taken[addr] = 1 103 # addr = addr + 1 104 # 105 # #Should be dynamic based on the number of hosts in here 106 # size = netmask 107 # numaddrs = 1 << (32 - size) 108 # i = network(masterLink.ip,masterLink.netmask) 109 # while taken.has_key(i): 110 # i = i + numaddrs 111 # 112 # return show_addr(i) 113 # 114 114 def freeInterlinkIP(masterLink): 115 115 taken = {} -
trunk/initial_data.json
r6424 r6431 484 484 "session_data": "gAJ9cQEoVRJfYXV0aF91c2VyX2JhY2tlbmRxAlUpZGphbmdvLmNvbnRyaWIuYXV0aC5iYWNrZW5k\ncy5Nb2RlbEJhY2tlbmRxA1UNX2F1dGhfdXNlcl9pZHEESwF1LmQ2ZjkxZjcxZTMwYmVjYzcyNDk1\nYTk5MjRlNWYxNTJm\n" 485 485 } 486 } 486 }, 487 { 488 "pk": 1, 489 "model": "exodus.antenna", 490 "fields": { 491 "type": "Omni", 492 "gain": 6 493 } 494 }, 495 { 496 "pk": 2, 497 "model": "exodus.antenna", 498 "fields": { 499 "type": "SD9", 500 "gain": 9 501 } 502 }, 503 { 504 "pk": 3, 505 "model": "exodus.antenna", 506 "fields": { 507 "type": "SD15", 508 "gain": 15 509 } 510 }, 511 { 512 "pk": 4, 513 "model": "exodus.antenna", 514 "fields": { 515 "type": "SD19", 516 "gain": 19 517 } 518 }, 519 { 520 "pk": 5, 521 "model": "exodus.antenna", 522 "fields": { 523 "type": "2020", 524 "gain": 20 525 } 526 }, 527 { 528 "pk": 6, 529 "model": "exodus.antenna", 530 "fields": { 531 "type": "4040", 532 "gain": 20 533 } 534 }, 535 { 536 "pk": 7, 537 "model": "exodus.antenna", 538 "fields": { 539 "type": "8080", 540 "gain": 80 541 } 542 }, 543 { 544 "pk": 1, 545 "model": "exodus.location", 546 "fields": { 547 "latitude": "54.55", 548 "description": "Joost kantoor", 549 "longitude": "33.44" 550 } 551 }, 552 { 553 "pk": 2, 554 "model": "exodus.location", 555 "fields": { 556 "latitude": "46.77", 557 "description": "Rapenburg", 558 "longitude": "45.55" 559 } 560 }, 561 { 562 "pk": 3, 563 "model": "exodus.location", 564 "fields": { 565 "latitude": "34.55", 566 "description": "kerk", 567 "longitude": "44.55" 568 } 569 }, 570 { 571 "pk": 1, 572 "model": "exodus.dnsserver", 573 "fields": { 574 "ipaddress": "172.17.8.68", 575 "domainname": "wleiden.net" 576 } 577 }, 578 { 579 "pk": 2, 580 "model": "exodus.dnsserver", 581 "fields": { 582 "ipaddress": "172.17.143.4", 583 "domainname": "wzoeterwoude.net" 584 } 585 }, 586 { 587 "pk": 1, 588 "model": "exodus.network", 589 "fields": { 590 "netmask": 16, 591 "name": "wleiden.net", 592 "ipspacestart": "172.16.0.0" 593 } 594 }, 595 { 596 "pk": 2, 597 "model": "exodus.network", 598 "fields": { 599 "netmask": 16, 600 "name": "walphen.net", 601 "ipspacestart": "172.18.0.0" 602 } 603 }, 604 { 605 "pk": 3, 606 "model": "exodus.network", 607 "fields": { 608 "netmask": 16, 609 "name": "wzoeterwoude.net", 610 "ipspacestart": "172.27.0.0" 611 } 612 }, 613 { 614 "pk": 3, 615 "model": "exodus.node", 616 "fields": { 617 "status": "up", 618 "network": 1, 619 "name": "Cope", 620 "masterip": "172.16.3.1", 621 "location": 2 622 } 623 }, 624 { 625 "pk": 1, 626 "model": "exodus.node", 627 "fields": { 628 "status": "up", 629 "network": 1, 630 "name": "Rick1", 631 "masterip": "172.16.0.1", 632 "location": 1 633 } 634 }, 635 { 636 "pk": 2, 637 "model": "exodus.node", 638 "fields": { 639 "status": "up", 640 "network": 1, 641 "name": "Rick2", 642 "masterip": "172.16.1.1", 643 "location": 1 644 } 645 }, 646 { 647 "pk": 4, 648 "model": "exodus.node", 649 "fields": { 650 "status": "up", 651 "network": 3, 652 "name": "nieuwe Kerk", 653 "masterip": "172.27.0.1", 654 "location": 3 655 } 656 }, 657 { 658 "pk": 1, 659 "model": "exodus.interface", 660 "fields": { 661 "node": 1, 662 "polar": "", 663 "iface": "eth0", 664 "ssid": "", 665 "antenna": null, 666 "accesspoint": false, 667 "ip": "172.16.0.6", 668 "netmask": 30, 669 "link": 1, 670 "mode": "", 671 "shortdesc": "2Rick2", 672 "type": "eth", 673 "channel": null, 674 "desc": "Ethernet naar Rick2" 675 } 676 }, 677 { 678 "pk": 2, 679 "model": "exodus.interface", 680 "fields": { 681 "node": 2, 682 "polar": "", 683 "iface": "eth0", 684 "ssid": "", 685 "antenna": null, 686 "accesspoint": false, 687 "ip": "172.16.0.7", 688 "netmask": 30, 689 "link": 1, 690 "mode": "", 691 "shortdesc": "2Rick1", 692 "type": "eth", 693 "channel": null, 694 "desc": "Ethernet naar Rick1" 695 } 696 }, 697 { 698 "pk": 3, 699 "model": "exodus.interface", 700 "fields": { 701 "node": 1, 702 "polar": "hr", 703 "iface": "wi0", 704 "ssid": "AP.Rick2.wleiden.net", 705 "antenna": 3, 706 "accesspoint": true, 707 "ip": "172.16.0.2", 708 "netmask": 32, 709 "link": 3, 710 "mode": "ms", 711 "shortdesc": "11b", 712 "type": "11b", 713 "channel": 1, 714 "desc": "11b" 715 } 716 }, 717 { 718 "pk": 4, 719 "model": "exodus.interface", 720 "fields": { 721 "node": 1, 722 "polar": "hr", 723 "iface": "ath0", 724 "ssid": "ath0.nwKerk.wzoeterwoude.net", 725 "antenna": 3, 726 "accesspoint": false, 727 "ip": "172.27.0.6", 728 "netmask": 30, 729 "link": 5, 730 "mode": "mn", 731 "shortdesc": "2 nwkerk", 732 "type": "11a", 733 "channel": 5, 734 "desc": "11a naar nieuwe kerk" 735 } 736 }, 737 { 738 "pk": 5, 739 "model": "exodus.interface", 740 "fields": { 741 "node": 4, 742 "polar": "hr", 743 "iface": "ath0", 744 "ssid": "ath0.nwKerk.wzoeterwoude.net", 745 "antenna": 4, 746 "accesspoint": false, 747 "ip": "172.27.0.5", 748 "netmask": 30, 749 "link": 5, 750 "mode": "ms", 751 "shortdesc": "2 ick1", 752 "type": "11a", 753 "channel": 5, 754 "desc": "11a naar Rick1" 755 } 756 }, 757 { 758 "pk": 6, 759 "model": "exodus.interface", 760 "fields": { 761 "node": 4, 762 "polar": "hr", 763 "iface": "wi0", 764 "ssid": "AP.nieuwekerk.wzoeterwoude.net", 765 "antenna": 1, 766 "accesspoint": true, 767 "ip": "172.27.0.17", 768 "netmask": 28, 769 "link": 6, 770 "mode": "ms", 771 "shortdesc": "ap nwkerk", 772 "type": "11b", 773 "channel": 8, 774 "desc": "Ap voor de nieuwe kerk" 775 } 776 }, 777 { 778 "pk": 7, 779 "model": "exodus.interface", 780 "fields": { 781 "node": 3, 782 "polar": "vr", 783 "iface": "wi0", 784 "ssid": "wi0.cope.wleiden.net", 785 "antenna": 3, 786 "accesspoint": false, 787 "ip": "172.16.3.9", 788 "netmask": 29, 789 "link": 7, 790 "mode": "ms", 791 "shortdesc": "2rick1", 792 "type": "11b", 793 "channel": 1, 794 "desc": "wi0 naar nieuwe kerk en rick2" 795 } 796 }, 797 { 798 "pk": 8, 799 "model": "exodus.interface", 800 "fields": { 801 "node": 2, 802 "polar": "hr", 803 "iface": "ath0", 804 "ssid": "wi0.cope.wleiden.net", 805 "antenna": 3, 806 "accesspoint": false, 807 "ip": "172.16.3.10", 808 "netmask": 29, 809 "link": 7, 810 "mode": "mn", 811 "shortdesc": "2cope", 812 "type": "11g", 813 "channel": 1, 814 "desc": "Link naar Cope" 815 } 816 }, 817 { 818 "pk": 9, 819 "model": "exodus.interface", 820 "fields": { 821 "node": 4, 822 "polar": "vr", 823 "iface": "ath1", 824 "ssid": "wi0.cope.wleiden.net", 825 "antenna": 5, 826 "accesspoint": false, 827 "ip": "172.16.3.11", 828 "netmask": 29, 829 "link": 7, 830 "mode": "mn", 831 "shortdesc": "2cope", 832 "type": "11g", 833 "channel": 1, 834 "desc": "ath0 naar cope" 835 } 836 }, 837 { 838 "pk": 10, 839 "model": "exodus.interface", 840 "fields": { 841 "node": 3, 842 "polar": "hr", 843 "iface": "wi1", 844 "ssid": "ap.cope.wleiden.net", 845 "antenna": 5, 846 "accesspoint": true, 847 "ip": "172.16.3.17", 848 "netmask": 28, 849 "link": 10, 850 "mode": "ms", 851 "shortdesc": "omni cope", 852 "type": "11g", 853 "channel": 7, 854 "desc": "omni van cope" 855 } 856 } 487 857 ]
Note:
See TracChangeset
for help on using the changeset viewer.