wiki:NodesDatabase/Schema/GuifiNet

guifi.net Database

Our data is accessible in XML (we call it CNML as for Communities Network Markup Language) using the CNML link provided at the bottom page of each zone. As en example, for  a zone of about 1400 nodes at the bottom the CNML link drives you  here, where you can export all the information at several levels of depth.

We're now just delivering the XML. By looking into this it is possible to see very much which objects are described and with which attributes. To help documenting it, we can use  some tools looking at a valid XML code. With that, you can currently get the XML schema and DTD provided below.

By looking into this you see that there is an object hierarchy which might be very much general, basic and a summary: network → zones → child zones (up to n) → locations → devices → radios → interfaces → links.

CNML generated DTD

<!ELEMENT class EMPTY>
<!ATTLIST class mapping NMTOKEN #REQUIRED>
<!ATTLIST class network_description NMTOKEN #REQUIRED>

<!ELEMENT cnml ( class, network )>
<!ATTLIST cnml generated CDATA #REQUIRED>
<!ATTLIST cnml server_id NMTOKEN #REQUIRED>
<!ATTLIST cnml server_url CDATA #REQUIRED>
<!ATTLIST cnml version NMTOKEN #REQUIRED>

<!ELEMENT device ( #PCDATA | interface | radio | service )*>
<!ATTLIST device created CDATA #REQUIRED>
<!ATTLIST device firmware CDATA #IMPLIED>
<!ATTLIST device graph_server NMTOKEN #IMPLIED>
<!ATTLIST device id NMTOKEN #REQUIRED>
<!ATTLIST device name CDATA #IMPLIED>
<!ATTLIST device snmp_index ( 2 | 3 | 4 | 5 | 9 | v ) #IMPLIED>
<!ATTLIST device status ( Building | Dropped | Planned | Reserved | Testing | Working ) #REQUIRED>
<!ATTLIST device title ID #REQUIRED>
<!ATTLIST device type ( ADSL | cam | generic | nat | phone | radio | server ) #REQUIRED>
<!ATTLIST device updated CDATA #IMPLIED>

<!ELEMENT interface ( link* )>
<!ATTLIST interface id NMTOKEN #REQUIRED>
<!ATTLIST interface ipv4 NMTOKEN #IMPLIED>
<!ATTLIST interface mac NMTOKEN #IMPLIED>
<!ATTLIST interface mask ( 255.255.255.0 | 255.255.255.192 | 255.255.255.224 | 255.255.255.240 | 255.255.255.248 | 255.255.255.252 ) #REQUIRED>
<!ATTLIST interface type CDATA #REQUIRED>

<!ELEMENT link EMPTY>
<!ATTLIST link id NMTOKEN #REQUIRED>
<!ATTLIST link link_status ( Building | Planned | Reserved | Testing | Working ) #REQUIRED>
<!ATTLIST link link_type CDATA #REQUIRED>
<!ATTLIST link linked_device_id NMTOKEN #REQUIRED>
<!ATTLIST link linked_interface_id NMTOKEN #REQUIRED>
<!ATTLIST link linked_node_id NMTOKEN #REQUIRED>

<!ELEMENT network ( zone )>
<!ATTLIST network ap NMTOKEN #REQUIRED>
<!ATTLIST network client NMTOKEN #REQUIRED>
<!ATTLIST network devices NMTOKEN #REQUIRED>
<!ATTLIST network links NMTOKEN #REQUIRED>
<!ATTLIST network nodes NMTOKEN #REQUIRED>
<!ATTLIST network services NMTOKEN #REQUIRED>

<!ELEMENT node ( #PCDATA | device )*>
<!ATTLIST node access_points NMTOKEN #IMPLIED>
<!ATTLIST node antenna_elevation NMTOKEN #IMPLIED>
<!ATTLIST node clients ( 1 | 2 | 3 | 4 ) #IMPLIED>
<!ATTLIST node created CDATA #REQUIRED>
<!ATTLIST node devices ( 1 | 10 | 2 | 3 | 4 | 5 | 6 | 7 | 8 ) #IMPLIED>
<!ATTLIST node graph_server ( 11747 | 15618 | 6558 | 6572 | 6673 | 6833 | 6836 | 8444 ) #IMPLIED>
<!ATTLIST node id NMTOKEN #REQUIRED>
<!ATTLIST node lat NMTOKEN #REQUIRED>
<!ATTLIST node links NMTOKEN #IMPLIED>
<!ATTLIST node lon NMTOKEN #REQUIRED>
<!ATTLIST node services NMTOKEN #IMPLIED>
<!ATTLIST node status ( Building | Planned | Reserved | Testing | Working ) #REQUIRED>
<!ATTLIST node title ID #REQUIRED>
<!ATTLIST node updated CDATA #IMPLIED>

<!ELEMENT radio ( interface* )>
<!ATTLIST radio antenna_angle ( 120 | 30 | 360 | 6 | 60 | 90 ) #IMPLIED>
<!ATTLIST radio antenna_azimuth NMTOKEN #IMPLIED>
<!ATTLIST radio antenna_gain ( 12 | 14 | 18 | 2 | 21 | 24 | 8 ) #IMPLIED>
<!ATTLIST radio channel NMTOKEN #IMPLIED>
<!ATTLIST radio device_id NMTOKEN #REQUIRED>
<!ATTLIST radio id NMTOKEN #REQUIRED>
<!ATTLIST radio mode ( ap | client ) #REQUIRED>
<!ATTLIST radio protocol ( 802.11a | 802.11b | 802.11g | legacy ) #IMPLIED>
<!ATTLIST radio snmp_index ( 6 ) #IMPLIED>
<!ATTLIST radio snmp_name ( wifi0 | wlan1 | wlan2 | wlan3 | wlan4 | wlan5 | wlan6 | wlan7 | wlan8 ) #IMPLIED>
<!ATTLIST radio ssid NMTOKEN #IMPLIED>

<!ELEMENT service EMPTY>
<!ATTLIST service created CDATA #REQUIRED>
<!ATTLIST service id NMTOKEN #REQUIRED>
<!ATTLIST service status ( Building | Planned | Testing | Working ) #REQUIRED>
<!ATTLIST service title ID #REQUIRED>
<!ATTLIST service type NMTOKEN #REQUIRED>
<!ATTLIST service updated CDATA #IMPLIED>

<!ELEMENT zone ( #PCDATA | node | zone )*>
<!ATTLIST zone access_points NMTOKEN #REQUIRED>
<!ATTLIST zone box CDATA #REQUIRED>
<!ATTLIST zone clients NMTOKEN #REQUIRED>
<!ATTLIST zone created CDATA #REQUIRED>
<!ATTLIST zone devices NMTOKEN #IMPLIED>
<!ATTLIST zone dns_servers CDATA #IMPLIED>
<!ATTLIST zone graph_server NMTOKEN #IMPLIED>
<!ATTLIST zone id NMTOKEN #REQUIRED>
<!ATTLIST zone links NMTOKEN #REQUIRED>
<!ATTLIST zone ntp_servers CDATA #IMPLIED>
<!ATTLIST zone parent_id ( 15231 | 2444 | 8349 ) #REQUIRED>
<!ATTLIST zone services NMTOKEN #IMPLIED>
<!ATTLIST zone time_zone CDATA #FIXED "+01 2 2">
<!ATTLIST zone title CDATA #REQUIRED>
<!ATTLIST zone updated CDATA #REQUIRED>
<!ATTLIST zone zone_nodes NMTOKEN #REQUIRED>

CNML generated schema

<?xml version="1.0" encoding="UTF-8" ?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="class">
    <xs:complexType>
      <xs:attribute name="network_description" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="mapping" type="xs:NMTOKEN" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="cnml">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="class" />
        <xs:element ref="network" />
      </xs:sequence>
      <xs:attribute name="version" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="generated" type="xs:string" use="required" />
      <xs:attribute name="server_url" type="xs:string" use="required" />
      <xs:attribute name="server_id" type="xs:NMTOKEN" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="device">
    <xs:complexType mixed="true">
      <xs:choice>
        <xs:element ref="interface" />
        <xs:element ref="radio" />
        <xs:element ref="service" />
      </xs:choice>
      <xs:attribute name="firmware" type="xs:string" use="optional" />
      <xs:attribute name="name" type="xs:string" use="optional" />
      <xs:attribute name="id" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="created" type="xs:string" use="required" />
      <xs:attribute name="status" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="Building" />
            <xs:enumeration value="Dropped" />
            <xs:enumeration value="Planned" />
            <xs:enumeration value="Reserved" />
            <xs:enumeration value="Testing" />
            <xs:enumeration value="Working" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="updated" type="xs:string" use="optional" />
      <xs:attribute name="snmp_index" use="optional">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="2" />
            <xs:enumeration value="3" />
            <xs:enumeration value="4" />
            <xs:enumeration value="5" />
            <xs:enumeration value="9" />
            <xs:enumeration value="v" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="type" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="ADSL" />
            <xs:enumeration value="cam" />
            <xs:enumeration value="generic" />
            <xs:enumeration value="nat" />
            <xs:enumeration value="phone" />
            <xs:enumeration value="radio" />
            <xs:enumeration value="server" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="graph_server" type="xs:NMTOKEN" use="optional" />
      <xs:attribute name="title" type="xs:ID" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="interface">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="link" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
      <xs:attribute name="mask" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="255.255.255.0" />
            <xs:enumeration value="255.255.255.192" />
            <xs:enumeration value="255.255.255.224" />
            <xs:enumeration value="255.255.255.240" />
            <xs:enumeration value="255.255.255.248" />
            <xs:enumeration value="255.255.255.252" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="ipv4" type="xs:NMTOKEN" use="optional" />
      <xs:attribute name="type" type="xs:string" use="required" />
      <xs:attribute name="mac" type="xs:NMTOKEN" use="optional" />
      <xs:attribute name="id" type="xs:NMTOKEN" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="link">
    <xs:complexType>
      <xs:attribute name="linked_device_id" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="link_status" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="Building" />
            <xs:enumeration value="Planned" />
            <xs:enumeration value="Reserved" />
            <xs:enumeration value="Testing" />
            <xs:enumeration value="Working" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="linked_interface_id" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="link_type" type="xs:string" use="required" />
      <xs:attribute name="linked_node_id" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="id" type="xs:NMTOKEN" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="network">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="zone" />
      </xs:sequence>
      <xs:attribute name="client" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="nodes" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="links" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="devices" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="services" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="ap" type="xs:NMTOKEN" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="node">
    <xs:complexType mixed="true">
      <xs:choice>
        <xs:element ref="device" />
      </xs:choice>
      <xs:attribute name="lon" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="id" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="antenna_elevation" type="xs:NMTOKEN" use="optional" />
      <xs:attribute name="created" type="xs:string" use="required" />
      <xs:attribute name="status" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="Building" />
            <xs:enumeration value="Planned" />
            <xs:enumeration value="Reserved" />
            <xs:enumeration value="Testing" />
            <xs:enumeration value="Working" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="updated" type="xs:string" use="optional" />
      <xs:attribute name="access_points" type="xs:NMTOKEN" use="optional" />
      <xs:attribute name="lat" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="graph_server" use="optional">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="11747" />
            <xs:enumeration value="15618" />
            <xs:enumeration value="6558" />
            <xs:enumeration value="6572" />
            <xs:enumeration value="6673" />
            <xs:enumeration value="6833" />
            <xs:enumeration value="6836" />
            <xs:enumeration value="8444" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="title" type="xs:ID" use="required" />
      <xs:attribute name="services" type="xs:NMTOKEN" use="optional" />
      <xs:attribute name="links" type="xs:NMTOKEN" use="optional" />
      <xs:attribute name="devices" use="optional">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="1" />
            <xs:enumeration value="10" />
            <xs:enumeration value="2" />
            <xs:enumeration value="3" />
            <xs:enumeration value="4" />
            <xs:enumeration value="5" />
            <xs:enumeration value="6" />
            <xs:enumeration value="7" />
            <xs:enumeration value="8" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="clients" use="optional">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="1" />
            <xs:enumeration value="2" />
            <xs:enumeration value="3" />
            <xs:enumeration value="4" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

  <xs:element name="radio">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="interface" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
      <xs:attribute name="antenna_azimuth" type="xs:NMTOKEN" use="optional" />
      <xs:attribute name="ssid" type="xs:NMTOKEN" use="optional" />
      <xs:attribute name="id" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="device_id" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="snmp_name" use="optional">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="wifi0" />
            <xs:enumeration value="wlan1" />
            <xs:enumeration value="wlan2" />
            <xs:enumeration value="wlan3" />
            <xs:enumeration value="wlan4" />
            <xs:enumeration value="wlan5" />
            <xs:enumeration value="wlan6" />
            <xs:enumeration value="wlan7" />
            <xs:enumeration value="wlan8" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="antenna_angle" use="optional">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="120" />
            <xs:enumeration value="30" />
            <xs:enumeration value="360" />
            <xs:enumeration value="6" />
            <xs:enumeration value="60" />
            <xs:enumeration value="90" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="mode" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="ap" />
            <xs:enumeration value="client" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="snmp_index" use="optional">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="6" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="channel" type="xs:NMTOKEN" use="optional" />
      <xs:attribute name="antenna_gain" use="optional">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="12" />
            <xs:enumeration value="14" />
            <xs:enumeration value="18" />
            <xs:enumeration value="2" />
            <xs:enumeration value="21" />
            <xs:enumeration value="24" />
            <xs:enumeration value="8" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="protocol" use="optional">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="802.11a" />
            <xs:enumeration value="802.11b" />
            <xs:enumeration value="802.11g" />
            <xs:enumeration value="legacy" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>

  <xs:element name="service">
    <xs:complexType>
      <xs:attribute name="updated" type="xs:string" use="optional" />
      <xs:attribute name="status" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="Building" />
            <xs:enumeration value="Planned" />
            <xs:enumeration value="Testing" />
            <xs:enumeration value="Working" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="type" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="title" type="xs:ID" use="required" />
      <xs:attribute name="id" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="created" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>

  <xs:element name="zone">
    <xs:complexType mixed="true">
      <xs:choice>
        <xs:element ref="node" />
        <xs:element ref="zone" />
      </xs:choice>
      <xs:attribute name="id" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="zone_nodes" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="ntp_servers" type="xs:string" use="optional" />
      <xs:attribute name="created" type="xs:string" use="required" />
      <xs:attribute name="updated" type="xs:string" use="required" />
      <xs:attribute name="box" type="xs:string" use="required" />
      <xs:attribute name="access_points" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="parent_id" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="15231" />
            <xs:enumeration value="2444" />
            <xs:enumeration value="8349" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="dns_servers" type="xs:string" use="optional" />
      <xs:attribute name="graph_server" type="xs:NMTOKEN" use="optional" />
      <xs:attribute name="title" type="xs:string" use="required" />
      <xs:attribute name="services" type="xs:NMTOKEN" use="optional" />
      <xs:attribute name="links" type="xs:NMTOKEN" use="required" />
      <xs:attribute name="devices" type="xs:NMTOKEN" use="optional" />
      <xs:attribute name="time_zone" type="xs:string" use="required" fixed="+01 2 2" />
      <xs:attribute name="clients" type="xs:NMTOKEN" use="required" />
    </xs:complexType>
  </xs:element>

</xs:schema>