Commit 005f5b5d authored by Martin van Es's avatar Martin van Es
Browse files

Dockerize the deploy

parent e0e55e1e
composer.json .env
composer.lock
CONTRIBUTING.md
COPYING
LICENSE
package-lock.json
package.json
README.org
SECURITY.md
TESTING.md
webpack.config.js
attributemap/
bin/
cert/ cert/
config-templates/
config/
dictionaries/
docs/
extra/
lib/
locales/
log/
metadata-templates/
metadata/
modules/
phpcs.xml
phpunit.xml
routing/
schemas/
src/
templates/
tests/
vendor/
www/
# Test_IdP # Test_IdP
## Docker-compose deploy
Copy env.example to .env and adjust all properties.
A valid wildcard certificate/chain and key should be stored in the cert directory. The filenames should be called:
```
wildcard_cert.crt
wildcard_chain.crt
wildcard_cert.key
```
testidp/config/logins.json contains all the testaccounts and is volume mounted.
testidp/admin/application/classes/phpmailer.php contains the phpmailer configuration for sending the admin mails. You should replace the Username/Password, Host and setFrom.
## Manual deploy
All files below testidp/simplesamlphp should be dropped in a working simplesamlphp installation.
The testidp/admin directory should be served as a separate vhost.
This project consists of two separate parts for simpleSAMLphp. This README assumes you know your way around in simpleSAMLphp and know how to setup a working implementation. This project consists of two separate parts for simpleSAMLphp. This README assumes you know your way around in simpleSAMLphp and know how to setup a working implementation.
The authentication module is located in modules and is called customauth, and should be enabled like this: The authentication module is located in modules and is called customauth, and should be enabled like this:
...@@ -20,6 +36,7 @@ The Database consists of 3 tables: ...@@ -20,6 +36,7 @@ The Database consists of 3 tables:
* options * options
* idps * idps
* config * config
* accounts
**options** contains the definitions of the adjustable simpleSAMLPHP hosted IdP configuration options, this can be used to render a configuration interface. The options have a key, which is used in config to configure this option for a specific IdP. **options** contains the definitions of the adjustable simpleSAMLPHP hosted IdP configuration options, this can be used to render a configuration interface. The options have a key, which is used in config to configure this option for a specific IdP.
...@@ -27,5 +44,5 @@ The Database consists of 3 tables: ...@@ -27,5 +44,5 @@ The Database consists of 3 tables:
**config** contains the per-IdP-options values that are dynamically loaded into the IdP config. Most of them change the dynamically created metadata for this IdP. **config** contains the per-IdP-options values that are dynamically loaded into the IdP config. Most of them change the dynamically created metadata for this IdP.
**accounts** contains the registered SP accounts
-- MySQL dump 10.17 Distrib 10.3.25-MariaDB, for debian-linux-gnu (x86_64) -- MariaDB dump 10.19 Distrib 10.5.12-MariaDB, for debian-linux-gnu (x86_64)
-- --
-- Host: localhost Database: testidp -- Host: 127.0.0.1 Database: testidp
-- ------------------------------------------------------ -- ------------------------------------------------------
-- Server version 10.3.25-MariaDB-0ubuntu0.20.04.1 -- Server version 10.3.31-MariaDB-0ubuntu0.20.04.1
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
...@@ -15,6 +15,26 @@ ...@@ -15,6 +15,26 @@
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `accounts`
--
DROP TABLE IF EXISTS `accounts`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `accounts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`token` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`entity_id` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`timestamp` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`ip` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`metadata` text COLLATE utf8_unicode_ci NOT NULL,
`status` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=65 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
-- --
-- Table structure for table `config` -- Table structure for table `config`
-- --
...@@ -26,23 +46,13 @@ CREATE TABLE `config` ( ...@@ -26,23 +46,13 @@ CREATE TABLE `config` (
`idp_id` int(10) unsigned NOT NULL, `idp_id` int(10) unsigned NOT NULL,
`option_id` int(10) unsigned NOT NULL, `option_id` int(10) unsigned NOT NULL,
`value` varchar(100) DEFAULT NULL, `value` varchar(100) DEFAULT NULL,
KEY `config_FK` (`idp_id`), UNIQUE KEY `config_UN` (`idp_id`,`option_id`),
KEY `config_FK_1` (`option_id`), KEY `config_FK_1` (`option_id`),
CONSTRAINT `config_FK` FOREIGN KEY (`idp_id`) REFERENCES `idps` (`idp_id`), CONSTRAINT `config_FK` FOREIGN KEY (`idp_id`) REFERENCES `idps` (`idp_id`),
CONSTRAINT `config_FK_1` FOREIGN KEY (`option_id`) REFERENCES `options` (`option_id`) CONSTRAINT `config_FK_1` FOREIGN KEY (`option_id`) REFERENCES `options` (`option_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `config`
--
LOCK TABLES `config` WRITE;
/*!40000 ALTER TABLE `config` DISABLE KEYS */;
INSERT INTO `config` VALUES (1,1,'Foobar DB DisplayName'),(1,2,'Foobar DB'),(1,3,'http://foobar.org/url'),(1,5,'technical'),(1,6,'technical@geant.org'),(1,7,'FooDB'),(1,8,'Doe'),(1,9,'+316012345678'),(1,10,'Foobar DB inc.'),(1,11,'Foobar DB mdui'),(1,12,'Foober DB description mdui'),(1,13,'Foobar DB authority'),(1,14,'2008-01-17T11:28:03Z'),(1,15,'http://foobar.org/policy/en');
/*!40000 ALTER TABLE `config` ENABLE KEYS */;
UNLOCK TABLES;
-- --
-- Table structure for table `idps` -- Table structure for table `idps`
-- --
...@@ -56,19 +66,9 @@ CREATE TABLE `idps` ( ...@@ -56,19 +66,9 @@ CREATE TABLE `idps` (
`comment` varchar(100) DEFAULT NULL, `comment` varchar(100) DEFAULT NULL,
`sp_metadata` text DEFAULT NULL, `sp_metadata` text DEFAULT NULL,
PRIMARY KEY (`idp_id`) PRIMARY KEY (`idp_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4; ) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `idps`
--
LOCK TABLES `idps` WRITE;
/*!40000 ALTER TABLE `idps` DISABLE KEYS */;
INSERT INTO `idps` VALUES (1,'foobar','Test Foobar IdP','<?xml version=\"1.0\"?>\n<md:EntityDescriptor xmlns:md=\"urn:oasis:names:tc:SAML:2.0:metadata\" entityID=\"https://foobar.testidp.incubator.geant.org/saml/module.php/saml/sp/metadata.php/default-sp\">\n <md:SPSSODescriptor protocolSupportEnumeration=\"urn:oasis:names:tc:SAML:2.0:protocol urn:oasis:names:tc:SAML:1.1:protocol\">\n <md:SingleLogoutService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect\" Location=\"https://foobar.testidp.incubator.geant.org/saml/module.php/saml/sp/saml2-logout.php/default-sp\"/>\n <md:AssertionConsumerService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST\" Location=\"https://foobar.testidp.incubator.geant.org/saml/module.php/saml/sp/saml2-acs.php/default-sp\" index=\"0\"/>\n <md:AssertionConsumerService Binding=\"urn:oasis:names:tc:SAML:1.0:profiles:browser-post\" Location=\"https://foobar.testidp.incubator.geant.org/saml/module.php/saml/sp/saml1-acs.php/default-sp\" index=\"1\"/>\n <md:AssertionConsumerService Binding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact\" Location=\"https://foobar.testidp.incubator.geant.org/saml/module.php/saml/sp/saml2-acs.php/default-sp\" index=\"2\"/>\n <md:AssertionConsumerService Binding=\"urn:oasis:names:tc:SAML:1.0:profiles:artifact-01\" Location=\"https://foobar.testidp.incubator.geant.org/saml/module.php/saml/sp/saml1-acs.php/default-sp/artifact\" index=\"3\"/>\n </md:SPSSODescriptor>\n</md:EntityDescriptor>');
/*!40000 ALTER TABLE `idps` ENABLE KEYS */;
UNLOCK TABLES;
-- --
-- Table structure for table `options` -- Table structure for table `options`
-- --
...@@ -91,9 +91,13 @@ CREATE TABLE `options` ( ...@@ -91,9 +91,13 @@ CREATE TABLE `options` (
LOCK TABLES `options` WRITE; LOCK TABLES `options` WRITE;
/*!40000 ALTER TABLE `options` DISABLE KEYS */; /*!40000 ALTER TABLE `options` DISABLE KEYS */;
INSERT INTO `options` VALUES (1,'OrganizationDisplayName','string','Organization Display name'),(2,'OrganizationName','string','Organization Name'),(3,'OrganizationURL','string','Organization URL'),(5,'contacts:a:contactType','string','e.g. technical or support'),(6,'contacts:a:emailAddress','string','email'),(7,'contacts:a:givenName','string','Given name of the contact'),(8,'contacts:a:surName','string','Surname'),(9,'contacts:a:telephoneNumber','string','Phone number'),(10,'contacts:a:company','string','Company name'),(11,'UIInfo:DisplayName:en','string','Display name (UIInfo)'),(12,'UIInfo:Description:en','string','Description (UIInfo)'),(13,'RegistrationInfo:authority','string','Registration authority'),(14,'RegistrationInfo:instant','date','Registraion instant (date format)'),(15,'RegistrationInfo:policies:en','string','Policy URL (en)'); INSERT INTO `options` VALUES (1,'OrganizationDisplayName','string','Organization Display name'),(2,'OrganizationName','string','Organization Name'),(3,'OrganizationURL','string','Organization URL'),(5,'contacts:a:contactType','string','e.g. technical or support'),(6,'contacts:a:emailAddress','string','email'),(7,'contacts:a:givenName','string','Given name of the contact'),(8,'contacts:a:surName','string','Surname'),(9,'contacts:a:telephoneNumber','string','Phone number'),(10,'contacts:a:company','string','Company name'),(11,'UIInfo:DisplayName:en','string','Display name (UIInfo)'),(12,'UIInfo:Description:en','string','Description (UIInfo)'),(13,'RegistrationInfo:authority','string','Registration authority'),(14,'RegistrationInfo:instant','date','Registration instant (date format)'),(15,'RegistrationInfo:policies:en','string','Policy URL (en)');
/*!40000 ALTER TABLE `options` ENABLE KEYS */; /*!40000 ALTER TABLE `options` ENABLE KEYS */;
UNLOCK TABLES; UNLOCK TABLES;
--
-- Dumping routines for database 'testidp'
--
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
...@@ -104,4 +108,4 @@ UNLOCK TABLES; ...@@ -104,4 +108,4 @@ UNLOCK TABLES;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2021-04-08 12:02:51 -- Dump completed on 2021-09-24 13:19:30
---
version: '2.3'
services:
db:
image: mariadb
restart: always
environment:
MARIADB_RANDOM_ROOT_PASSWORD: 'yes'
MARIADB_DATABASE: testidp
MARIADB_USER: ${MARIADB_USER}
MARIADB_PASSWORD: ${MARIADB_PASSWORD}
volumes:
- ./database/testidp.sql:/docker-entrypoint-initdb.d/testidp.sql
testidp:
build:
context: ./testidp
args:
SALT: ${SALT}
DOMAIN: ${DOMAIN}
MARIADB_USER: ${MARIADB_USER}
MARIADB_PASSWORD: ${MARIADB_PASSWORD}
restart: always
ports:
- 8080:80
- 8443:443
volumes:
- ./cert:/etc/apache2/cert
- ./testidp/simplesamlphp/config/logins.json:/opt/simplesamlphp/config/logins.json
- ./testidp/admin/application/classes/phpmailer.php:/opt/admin/application/classes/phpmailer.php
depends_on:
- db
MARIADB_USER=admin
MARIADB_PASSWORD=admin
DOMAIN=example.org
SALT=secret_salt
# simplesamlphp-module-customauth
CustomAuth simpleSAML php auth source
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="297mm"
height="210mm"
viewBox="0 0 297 210"
version="1.1"
id="svg8"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"
sodipodi:docname="test_idp_architecture.svg">
<defs
id="defs2">
<marker
style="overflow:visible"
id="marker1669"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1667" />
</marker>
<marker
style="overflow:visible"
id="marker1569"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1567" />
</marker>
<marker
style="overflow:visible"
id="marker1479"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1477" />
</marker>
<marker
style="overflow:visible"
id="marker1395"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1393" />
</marker>
<marker
style="overflow:visible"
id="marker1309"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1307" />
</marker>
<marker
style="overflow:visible"
id="marker1247"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1245" />
</marker>
<marker
style="overflow:visible"
id="marker1183"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path1181" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Lend"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow1Lend"
inkscape:isstock="true"
inkscape:collect="always">
<path
transform="matrix(-0.8,0,0,-0.8,-10,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path842" />
</marker>
<marker
style="overflow:visible"
id="Arrow2Lend"
refX="0"
refY="0"
orient="auto"
inkscape:stockid="Arrow2Lend"
inkscape:isstock="true">
<path
transform="matrix(-1.1,0,0,-1.1,-1.1,0)"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.625;stroke-linejoin:round;stroke-opacity:1"
id="path860" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.016756"
inkscape:cx="561.25984"
inkscape:cy="396.85039"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
inkscape:document-rotation="0"
showgrid="false"
inkscape:snap-global="false"
inkscape:window-width="1920"
inkscape:window-height="1023"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="28.25012"
y="56.955173"
id="text835"><tspan
sodipodi:role="line"
id="tspan833"
x="28.25012"
y="56.955173"
style="stroke-width:0.264583">foobar.test-idp.geant.org</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="M 87.075871,60.751473 154.33407,76.294771"
id="path837"
sodipodi:nodetypes="cc" />
<rect
style="opacity:0.999612;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.600001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="rect1141"
width="112.27538"
height="58.464077"
x="40.806423"
y="104.81395" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="162.02615"
y="83.626305"
id="text1159"><tspan
sodipodi:role="line"
id="tspan1157"
x="162.02615"
y="83.626305"
style="stroke-width:0.264583">*.test-idp.geant.org</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1183)"
d="M 161.53815,87.168473 127.23014,102.07538"
id="path1179"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="103.88889"
y="115.69539"
id="text1235"><tspan
sodipodi:role="line"
id="tspan1233"
x="103.88889"
y="115.69539"
style="stroke-width:0.264583">test-idp</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1247)"
d="M 100.06737,112.99074 56.577202,64.636636"
id="path1243"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1309)"
d="M 51.018506,64.572729 83.47271,132.53948"
id="path1305"
sodipodi:nodetypes="cc" />
<rect
style="opacity:0.999612;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.600001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="rect1369"
width="37.068874"
height="52.583"
x="160.36746"
y="108.28088" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="181.10835"
y="118.71287"
id="text1373"><tspan
sodipodi:role="line"
id="tspan1371"
x="181.10835"
y="118.71287"
style="stroke-width:0.264583">DB</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="87.532883"
y="135.14799"
id="text1383"><tspan
sodipodi:role="line"
id="tspan1381"
x="87.532883"
y="135.14799"
style="stroke-width:0.264583">foobar</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1395)"
d="m 122.38602,132.41943 53.73814,-0.16083"
id="path1391"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1479)"
d="m 173.81279,150.24422 -49.57193,-0.16083"
id="path1475"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="49.679348"
y="153.82144"
id="text1557"><tspan
sodipodi:role="line"
id="tspan1555"
x="49.679348"
y="153.82144"
style="stroke-width:0.264583">config[foobar]</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1569)"
d="M 57.457342,144.56686 40.538359,62.323961"
id="path1565"
sodipodi:nodetypes="cc" />
<rect
style="opacity:0.999612;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.600001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="rect1653"
width="73.093201"
height="58.464077"
x="208.26524"
y="104.81395" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="257.59998"
y="116.0069"
id="text1657"><tspan
sodipodi:role="line"
id="tspan1655"
x="257.59998"
y="116.0069"
style="stroke-width:0.264583">GUI</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker1669)"
d="m 237.03538,132.74244 -49.57193,-0.16083"
id="path1665"
sodipodi:nodetypes="cc" />
<rect
style="opacity:0.999612;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.600001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none"
id="rect1869"
width="112.27538"
height="31.817488"
x="158.06119"
y="59.776882" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="243.02301"
y="70.650307"
id="text1873"><tspan
sodipodi:role="line"
id="tspan1871"
x="243.02301"
y="70.650307"
style="stroke-width:0.264583">DNS</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="136.01866"
y="69.844772"
id="text1895"><tspan
sodipodi:role="line"
id="tspan1893"
x="136.01866"
y="69.844772"
style="stroke-width:0.264583">1</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
x="74.241219"
y="80.351952"