diff --git a/doc/index.html b/doc/index.html
index 422d75594..8a40d6c2f 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -100,32 +100,36 @@ globalheader();
|
-
-YaCy is a peer-to-peer application for web search.
-
-- This is your web search engine for freedom of information:
-search requests are anonymous, independend and uncensored
-- No central server, no storage of user behaviour
-
- |
-
+
+Peer-to-Peer Web Search Engine
+Anonymous and uncensored search in a distributed and community-driven network of search-engine peers.
+
+
+Personal Search Appliance
+Create your own search portal with up to 10 million pages in your private web index.
| |
-
-YaCy can be used as your own, private search engine
-
-- Set up a search portal
-- Use YaCy to provide a search function for your own web pages
-- Host web pages with the built-in http-server
-
+ |
+
+
|
+
+
|
YaCy is GPL licensed, free software.
-
Für eine deutsche Dokumentation sehen sie bitte hier
+Für eine deutsche Dokumentation sehen sie bitte hier
diff --git a/htroot/Network.html b/htroot/Network.html
index 86e34b7a2..1c82147d7 100644
--- a/htroot/Network.html
+++ b/htroot/Network.html
@@ -14,20 +14,20 @@
#(page)#
- Network Overview
+ Overview of '#[networkName]#' Network
::
- Active Peers
+ Active Peers in '#[networkName]#' Network
::
- Passive Peers
+ Passive Peers in '#[networkName]#' Network
::
- Potential Peers
+ Potential Peers in '#[networkName]#' Network
::
Manually contacting Peer
#(/page)#
diff --git a/htroot/Network.java b/htroot/Network.java
index d7cfab1aa..827fa1c68 100644
--- a/htroot/Network.java
+++ b/htroot/Network.java
@@ -78,6 +78,8 @@ public class Network {
// return variable that accumulates replacements
final serverObjects prop = new serverObjects();
+ prop.put("page_networkTitle", sb.getConfig("network.unit.description", "unspecified"));
+ prop.put("page_networkName", sb.getConfig("network.unit.name", "unspecified"));
final boolean overview = (post == null) || (post.get("page", "0").equals("0"));
final String mySeedType = yacyCore.seedDB.mySeed.get(yacySeed.PEERTYPE, yacySeed.PEERTYPE_VIRGIN);
diff --git a/htroot/NetworkPicture.java b/htroot/NetworkPicture.java
index 01df35e05..4570f5b79 100644
--- a/htroot/NetworkPicture.java
+++ b/htroot/NetworkPicture.java
@@ -43,7 +43,6 @@
// the intact and unchanged copyright notice.
// Contributions and changes to the program code must be marked as such.
-
import de.anomic.http.httpHeader;
import de.anomic.plasma.plasmaGrafics;
import de.anomic.server.serverObjects;
@@ -79,7 +78,7 @@ public class NetworkPicture {
if (passiveLimit > 1000000) passiveLimit = 1000000;
if (potentialLimit > 1000000) potentialLimit = 1000000;
if (maxCount > 1000) maxCount = 1000;
- return plasmaGrafics.getNetworkPicture(10000, width, height, passiveLimit, potentialLimit, maxCount, corona);
+ return plasmaGrafics.getNetworkPicture(10000, width, height, passiveLimit, potentialLimit, maxCount, corona, env.getConfig("network.unit.name", "unspecified"), env.getConfig("network.unit.description", "unspecified"));
}
}
diff --git a/htroot/Status.java b/htroot/Status.java
index 347708571..030a69dc3 100644
--- a/htroot/Status.java
+++ b/htroot/Status.java
@@ -119,10 +119,6 @@ public class Status {
}
}
- /*
- versionProbe=http://www.anomic.de/AnomicHTTPProxy/release.txt
- superseedFile=superseed.txt
- */
// update seed info
yacyCore.peerActions.updateMySeed();
diff --git a/source/de/anomic/http/httpc.java b/source/de/anomic/http/httpc.java
index f509e557d..3f3e0159d 100644
--- a/source/de/anomic/http/httpc.java
+++ b/source/de/anomic/http/httpc.java
@@ -1372,6 +1372,33 @@ do upload
// return result
return a;
}
+
+ public static Map loadHashMap(URL url, httpRemoteProxyConfig proxy) {
+ try {
+ // should we use the proxy?
+ boolean useProxy = (proxy != null) &&
+ (proxy.useProxy()) &&
+ (proxy.useProxy4Yacy());
+
+ // sending request
+ final HashMap result = nxTools.table(
+ httpc.wget(
+ url,
+ url.getHost(),
+ 8000,
+ null,
+ null,
+ (useProxy) ? proxy : null,
+ null
+ )
+ , "UTF-8");
+
+ if (result == null) return new HashMap();
+ return result;
+ } catch (Exception e) {
+ return new HashMap();
+ }
+ }
public static httpHeader whead(
URL url,
diff --git a/source/de/anomic/plasma/plasmaCrawlLURL.java b/source/de/anomic/plasma/plasmaCrawlLURL.java
index bcb25edae..cdb36a851 100644
--- a/source/de/anomic/plasma/plasmaCrawlLURL.java
+++ b/source/de/anomic/plasma/plasmaCrawlLURL.java
@@ -187,6 +187,7 @@ public final class plasmaCrawlLURL {
oldEntry = null;
}
} catch (Exception e) {
+ e.printStackTrace();
oldEntry = null;
}
if ((oldEntry != null) && (entry.isOlder(oldEntry))) {
diff --git a/source/de/anomic/plasma/plasmaGrafics.java b/source/de/anomic/plasma/plasmaGrafics.java
index d419a427d..40401d7bd 100644
--- a/source/de/anomic/plasma/plasmaGrafics.java
+++ b/source/de/anomic/plasma/plasmaGrafics.java
@@ -127,7 +127,7 @@ public class plasmaGrafics {
if (primarySearches == null) return null; // this was a local search and there are no threads
// get a copy of a recent network picture
- ymageMatrix eventPicture = getNetworkPicture(120000);
+ ymageMatrix eventPicture = getNetworkPicture(120000, plasmaSwitchboard.getSwitchboard().getConfig("network.unit.name", "unspecified"), plasmaSwitchboard.getSwitchboard().getConfig("network.unit.description", "unspecified"));
if (eventPicture instanceof ymageMatrix) eventPicture = (ymageMatrix) eventPicture; //new ymageMatrix((ymageMatrix) eventPicture);
// TODO: fix cloning of ymageMatrix pictures
@@ -172,18 +172,18 @@ public class plasmaGrafics {
return eventPicture;
}
- public static ymageMatrix getNetworkPicture(long maxAge) {
- return getNetworkPicture(maxAge, 640, 480, 300, 300, 1000, true);
+ public static ymageMatrix getNetworkPicture(long maxAge, String networkName, String networkTitle) {
+ return getNetworkPicture(maxAge, 640, 480, 300, 300, 1000, true, networkName, networkTitle);
}
- public static ymageMatrix getNetworkPicture(long maxAge, int width, int height, int passiveLimit, int potentialLimit, int maxCount, boolean corona) {
+ public static ymageMatrix getNetworkPicture(long maxAge, int width, int height, int passiveLimit, int potentialLimit, int maxCount, boolean corona, String networkName, String networkTitle) {
if ((networkPicture == null) || ((System.currentTimeMillis() - networkPictureDate) > maxAge)) {
- drawNetworkPicture(width, height, passiveLimit, potentialLimit, maxCount, corona);
+ drawNetworkPicture(width, height, passiveLimit, potentialLimit, maxCount, corona, networkName, networkTitle);
}
return networkPicture;
}
- private static void drawNetworkPicture(int width, int height, int passiveLimit, int potentialLimit, int maxCount, boolean corona) {
+ private static void drawNetworkPicture(int width, int height, int passiveLimit, int potentialLimit, int maxCount, boolean corona, String networkName, String networkTitle) {
int innerradius = Math.min(width, height) / 5;
int outerradius = innerradius + innerradius * yacyCore.seedDB.sizeConnected() / 100;
@@ -196,7 +196,7 @@ public class plasmaGrafics {
// draw network circle
networkPicture.setColor(COL_DHTCIRCLE);
- networkPicture.arc(width / 2, height / 2, innerradius - 20, innerradius + 20, 0, 360);
+ networkPicture.arc(width / 2, height / 2 + 20, innerradius - 20, innerradius + 20, 0, 360);
//System.out.println("Seed Maximum distance is " + yacySeed.maxDHTDistance);
//System.out.println("Seed Minimum distance is " + yacySeed.minDHTNumber);
@@ -212,7 +212,7 @@ public class plasmaGrafics {
while (e.hasMoreElements() && count < maxCount) {
seed = (yacySeed) e.nextElement();
if (seed != null) {
- drawNetworkPicturePeer(networkPicture, width / 2, height / 2, innerradius, outerradius, seed, COL_ACTIVE_DOT, COL_ACTIVE_LINE, COL_ACTIVE_TEXT, corona);
+ drawNetworkPicturePeer(networkPicture, width / 2, height / 2 + 20, innerradius, outerradius, seed, COL_ACTIVE_DOT, COL_ACTIVE_LINE, COL_ACTIVE_TEXT, corona);
count++;
}
}
@@ -226,7 +226,7 @@ public class plasmaGrafics {
if (seed != null) {
lastseen = Math.abs((System.currentTimeMillis() - seed.getLastSeenUTC()) / 1000 / 60);
if (lastseen > passiveLimit) break; // we have enough, this list is sorted so we don't miss anything
- drawNetworkPicturePeer(networkPicture, width / 2, height / 2, innerradius, outerradius, seed, COL_PASSIVE_DOT, COL_PASSIVE_LINE, COL_PASSIVE_TEXT, corona);
+ drawNetworkPicturePeer(networkPicture, width / 2, height / 2 + 20, innerradius, outerradius, seed, COL_PASSIVE_DOT, COL_PASSIVE_LINE, COL_PASSIVE_TEXT, corona);
count++;
}
}
@@ -240,22 +240,23 @@ public class plasmaGrafics {
if (seed != null) {
lastseen = Math.abs((System.currentTimeMillis() - seed.getLastSeenUTC()) / 1000 / 60);
if (lastseen > potentialLimit) break; // we have enough, this list is sorted so we don't miss anything
- drawNetworkPicturePeer(networkPicture, width / 2, height / 2, innerradius, outerradius, seed, COL_POTENTIAL_DOT, COL_POTENTIAL_LINE, COL_POTENTIAL_TEXT, corona);
+ drawNetworkPicturePeer(networkPicture, width / 2, height / 2 + 20, innerradius, outerradius, seed, COL_POTENTIAL_DOT, COL_POTENTIAL_LINE, COL_POTENTIAL_TEXT, corona);
count++;
}
}
totalCount += count;
// draw my own peer
- drawNetworkPicturePeer(networkPicture, width / 2, height / 2, innerradius, outerradius, yacyCore.seedDB.mySeed, COL_WE_DOT, COL_WE_LINE, COL_WE_TEXT, corona);
+ drawNetworkPicturePeer(networkPicture, width / 2, height / 2 + 20, innerradius, outerradius, yacyCore.seedDB.mySeed, COL_WE_DOT, COL_WE_LINE, COL_WE_TEXT, corona);
// draw description
networkPicture.setColor(COL_HEADLINE);
networkPicture.setMode(ymageMatrix.MODE_SUB);
- ymageToolPrint.print(networkPicture, 2, 8, 0, "THE YACY NETWORK", -1);
- ymageToolPrint.print(networkPicture, 2, 16, 0, "DRAWING OF " + totalCount + " SELECTED PEERS", -1);
+ ymageToolPrint.print(networkPicture, 2, 8, 0, "YACY NETWORK '" + networkName.toUpperCase() + "'", -1);
+ ymageToolPrint.print(networkPicture, 2, 16, 0, networkTitle.toUpperCase(), -1);
ymageToolPrint.print(networkPicture, width - 2, 8, 0, "SNAPSHOT FROM " + new Date().toString().toUpperCase(), 1);
-
+ ymageToolPrint.print(networkPicture, width - 2, 16, 0, "DRAWING OF " + totalCount + " SELECTED PEERS", 1);
+
// set timestamp
networkPictureDate = System.currentTimeMillis();
}
diff --git a/source/de/anomic/plasma/plasmaSwitchboard.java b/source/de/anomic/plasma/plasmaSwitchboard.java
index 0217cf71f..86c4b7814 100644
--- a/source/de/anomic/plasma/plasmaSwitchboard.java
+++ b/source/de/anomic/plasma/plasmaSwitchboard.java
@@ -893,9 +893,47 @@ public final class plasmaSwitchboard extends serverAbstractSwitch implements ser
// set loglevel and log
setLog(new serverLog("PLASMA"));
-
if (applyPro) this.log.logInfo("This is the pro-version of YaCy");
+ // remote proxy configuration
+ this.remoteProxyConfig = httpRemoteProxyConfig.init(this);
+ this.log.logConfig("Remote proxy configuration:\n" + this.remoteProxyConfig.toString());
+
+ // load network configuration into settings
+ String networkUnitDefinition = getConfig("network.unit.definition", "yacy.network.unit");
+ String networkGroupDefinition = getConfig("network.group.definition", "yacy.network.group");
+
+ // include additional network definition properties into our settings
+ // note that these properties cannot be set in the application because they are
+ // _always_ overwritten each time with the default values. This is done so on purpose.
+ // the network definition should be made either consistent for all peers,
+ // or independently using a bootstrap URL
+ Map initProps;
+ if (networkUnitDefinition.startsWith("http://")) {
+ try {
+ this.setConfig(httpc.loadHashMap(new URL(networkUnitDefinition), remoteProxyConfig));
+ } catch (MalformedURLException e) {
+ }
+ } else {
+ File networkUnitDefinitionFile = new File(rootPath, networkUnitDefinition);
+ if (networkUnitDefinitionFile.exists()) {
+ initProps = serverFileUtils.loadHashMap(networkUnitDefinitionFile);
+ this.setConfig(initProps);
+ }
+ }
+ if (networkGroupDefinition.startsWith("http://")) {
+ try {
+ this.setConfig(httpc.loadHashMap(new URL(networkGroupDefinition), remoteProxyConfig));
+ } catch (MalformedURLException e) {
+ }
+ } else {
+ File networkGroupDefinitionFile = new File(rootPath, networkGroupDefinition);
+ if (networkGroupDefinitionFile.exists()) {
+ initProps = serverFileUtils.loadHashMap(networkGroupDefinitionFile);
+ this.setConfig(initProps);
+ }
+ }
+
// load values from configs
this.plasmaPath = new File(rootPath, getConfig(DBPATH, DBPATH_DEFAULT));
this.log.logConfig("Plasma DB Path: " + this.plasmaPath.toString());
@@ -913,12 +951,6 @@ public final class plasmaSwitchboard extends serverAbstractSwitch implements ser
this.workPath = new File(rootPath, getConfig(WORK_PATH, WORK_PATH_DEFAULT));
this.log.logConfig("Work Path: " + this.workPath.toString());
- /* ============================================================================
- * Remote Proxy configuration
- * ============================================================================ */
- this.remoteProxyConfig = httpRemoteProxyConfig.init(this);
- this.log.logConfig("Remote proxy configuration:\n" + this.remoteProxyConfig.toString());
-
// set up local robots.txt
this.robotstxtConfig = httpdRobotsTxtConfig.init(this);
diff --git a/source/de/anomic/server/serverAbstractSwitch.java b/source/de/anomic/server/serverAbstractSwitch.java
index 030e7cbd7..8b7564798 100644
--- a/source/de/anomic/server/serverAbstractSwitch.java
+++ b/source/de/anomic/server/serverAbstractSwitch.java
@@ -84,7 +84,6 @@ public abstract class serverAbstractSwitch implements serverSwitch {
// predefine init's
Map initProps;
- configRemoved = new HashMap();
if (initFile.exists())
initProps = serverFileUtils.loadHashMap(initFile);
else
@@ -117,9 +116,9 @@ public abstract class serverAbstractSwitch implements serverSwitch {
else
configProps = new HashMap();
+ // remove all values from config that do not appear in init
+ configRemoved = new HashMap();
synchronized (configProps) {
- // remove all values from config that do not appear in init
- // (out-dated settings)
i = configProps.keySet().iterator();
String key;
while (i.hasNext()) {
@@ -212,6 +211,15 @@ public abstract class serverAbstractSwitch implements serverSwitch {
return accessTracker.keySet().iterator();
}
+ public void setConfig(Map otherConfigs) {
+ Iterator i = otherConfigs.entrySet().iterator();
+ Map.Entry entry;
+ while (i.hasNext()) {
+ entry = (Map.Entry) i.next();
+ setConfig((String) entry.getKey(), (String) entry.getValue());
+ }
+ }
+
public void setConfig(String key, boolean value) {
setConfig(key, (value) ? "true" : "false");
}
diff --git a/source/de/anomic/server/serverSwitch.java b/source/de/anomic/server/serverSwitch.java
index f1573e157..9818e5123 100644
--- a/source/de/anomic/server/serverSwitch.java
+++ b/source/de/anomic/server/serverSwitch.java
@@ -96,6 +96,7 @@ public interface serverSwitch {
public Iterator /*of serverThread-Names (String)*/ threadNames();
// the switchboard can be used to set and read properties
+ public void setConfig(Map otherConfigs);
public void setConfig(String key, long value);
public void setConfig(String key, String value);
public String getConfig(String key, String dflt);
diff --git a/source/de/anomic/yacy/yacyClient.java b/source/de/anomic/yacy/yacyClient.java
index b68034b0a..1f3d62106 100644
--- a/source/de/anomic/yacy/yacyClient.java
+++ b/source/de/anomic/yacy/yacyClient.java
@@ -259,9 +259,9 @@ public final class yacyClient {
final String key = crypt.randomSalt();
try {
// should we use the proxy?
- boolean useProxy = (yacyCore.seedDB.sb.remoteProxyConfig != null) &&
- (yacyCore.seedDB.sb.remoteProxyConfig.useProxy()) &&
- (yacyCore.seedDB.sb.remoteProxyConfig.useProxy4Yacy());
+ boolean useProxy = (plasmaSwitchboard.getSwitchboard().remoteProxyConfig != null) &&
+ (plasmaSwitchboard.getSwitchboard().remoteProxyConfig.useProxy()) &&
+ (plasmaSwitchboard.getSwitchboard().remoteProxyConfig.useProxy4Yacy());
// sending request
final HashMap result = nxTools.table(
@@ -278,7 +278,7 @@ public final class yacyClient {
8000,
null,
null,
- (useProxy)?yacyCore.seedDB.sb.remoteProxyConfig:null,
+ (useProxy)? plasmaSwitchboard.getSwitchboard().remoteProxyConfig:null,
null
)
, "UTF-8");
@@ -526,18 +526,28 @@ public final class yacyClient {
assert (urlEntry.hash().length() == 12) : "urlEntry.hash() = " + urlEntry.hash();
if (urlEntry.hash().length() != 12) continue; // bad url hash
indexURLEntry.Components comp = urlEntry.comp();
- if (blacklist.isListed(plasmaURLPattern.BLACKLIST_SEARCH, comp.url())) continue; // block with backlist
- urlManager.store(urlEntry);
- urlManager.stack(urlEntry, yacyCore.seedDB.mySeed.hash, targetPeer.hash, 2);
-
+ if (blacklist.isListed(plasmaURLPattern.BLACKLIST_SEARCH, comp.url())) {
+ yacyCore.log.logInfo("remote search (client): filtered blacklisted url " + comp.url() + " from peer " + targetPeer.getName());
+ continue; // block with backlist
+ }
+
// save the url entry
indexRWIEntry entry;
if (urlEntry.word() == null) {
- yacyCore.log.logWarning("DEBUG-SEARCH: no word attached from peer " + targetPeer.getName() + ", version " + targetPeer.getVersion());
+ yacyCore.log.logWarning("remote search (client): no word attached from peer " + targetPeer.getName() + ", version " + targetPeer.getVersion());
continue; // no word attached
}
+
// the search-result-url transports all the attributes of word indexes
entry = urlEntry.word();
+ if (!(entry.urlHash().equals(urlEntry.hash()))) {
+ yacyCore.log.logInfo("remote search (client): url-hash " + urlEntry.hash() + " does not belong to word-attached-hash " + entry.urlHash() + "; url = " + comp.url() + " from peer " + targetPeer.getName());
+ continue; // spammed
+ }
+
+ // passed all checks, store url
+ urlManager.store(urlEntry);
+ urlManager.stack(urlEntry, yacyCore.seedDB.mySeed.hash, targetPeer.hash, 2);
if (urlEntry.snippet() != null) {
// we don't store the snippets along the url entry, because they are search-specific.
diff --git a/source/de/anomic/yacy/yacyCore.java b/source/de/anomic/yacy/yacyCore.java
index e78dbaaeb..2e50bc85a 100644
--- a/source/de/anomic/yacy/yacyCore.java
+++ b/source/de/anomic/yacy/yacyCore.java
@@ -215,8 +215,8 @@ public class yacyCore {
// deploy peer actions
peerActions = new yacyPeerActions(seedDB, switchboard,
- new File(sb.getRootPath(), sb.getConfig("superseedFile", "superseed.txt")),
- switchboard.getConfig("superseedLocation", "http://www.yacy.net/yacy/superseed.txt"));
+ new File(sb.getRootPath(), sb.getConfig("network.unit.bootstrap.file", "superseed.txt")),
+ switchboard.getConfig("network.unit.bootstrap.url", "http://www.yacy.net/yacy/superseed.txt"));
dhtAgent = new yacyDHTAction(seedDB);
peerActions.deploy(dhtAgent);
peerActions.deploy(new yacyNewsAction(newsPool));
diff --git a/source/yacy.java b/source/yacy.java
index 79f7c24fb..69bfd8b4e 100644
--- a/source/yacy.java
+++ b/source/yacy.java
@@ -253,8 +253,7 @@ public final class yacy {
f = new File(homePath, "DATA/yacy.running");
if (f.exists()) { // another instance running? VM crash? User will have to care about this
- serverLog.logSevere("STARTUP", "the file " + f + " exists, this usually means that another instance of YaCy is using this DATA-folder.");
- serverLog.logSevere("STARTUP", "please make sure that DATA can be used exclusively by one YaCy. Quitting...");
+ serverLog.logSevere("STARTUP", "WARNING: the file " + f + " exists, this usually means that a YaCy instance is still running");
f.delete();
}
f.createNewFile();
diff --git a/yacy.init b/yacy.init
index 6a88b0806..59ee10e40 100644
--- a/yacy.init
+++ b/yacy.init
@@ -64,43 +64,14 @@ pkcs12ImportPwd =
# value is in milliseconds, default is one hour
server.maxTrackingTime = 3600000
-# peer-to-peer construction for distributed search
-# we have several stages:
-# 1st: a file within every distribution that has a list of URLs:
-# -> this is the superseed file
-# 2nd: the files that can be retrieved by the superseeds' URLs
-# are called seed list-files.
-# -> the seed list-files contain IP/port combinations of running
-# AnomicHTTPProxies
-# 3rd: the peers that are targeted within the seed files are called superpeers
-# 4th: the superpeers hold and share a list of all client/search/crawl peers
-#
-# some superpeers should be able to create again seed list-files.
-# These superpeers must upload their IP or their list of peer-IP's to a
-# ftp location to create the seed list-file.
-# Everyone who do so should mail his/her new seed location to mcanomic.de
-# The seed list-file location will then be included in the superseed file.
-# This superseed file is available then at two localtions:
-# - it is included in every distribution and
-# - updated through a specific URL-location
-# we see the file name and the URL of the superseed here:
-superseedFile=superseed.txt
-superseedLocation=http://www.yacy.net/superseed.txt
-
-# network definition
-# we distiguish local and global networks. Each network type can have different user groups
-# groups can be uncontrolled, moderated or controlled
-# Each group has a group master, but in case the group is uncontrolled the only task of the
-# group master is to provide a bootstrap file which contains peer addresses of peers that
-# are member of the group. All attributes are given in a single network description string
-# of the form:
-# network = :::{'uncontrolled'|'moderated'|'controlled'}:
-# in case that the network is the uncontrolled global dht-managed community for everybody,
-# the details defaults to:
-# network = all:world:global:uncontrolled:http://yacy.net/
-# the network-uri must have a sub-path yacy/seed.txt containing a list of urls pointing to the
-# peer-address of peers within the group of that network
-# several network definition strings can be listed
+# Network Definition
+# There can be separate YaCy networks, and managed sub-groups of the general network.
+# The essentials of the network definition are attached in separate property files.
+# The property here can also be a url where the definition can be loaded.
+# In case of privately managed networks, this configuration must be changed BEFORE it is released
+# to the members of the separated network peers.
+network.unit.definition = yacy.network.unit
+network.group.definition = yacy.network.group
# clusters within a network:
# every network can have an unlimited number of clusters. Clusters may be also completely
@@ -716,7 +687,7 @@ useYacyReferer = true
useYacyReferer__pro = false
# allow only 443(https-port) for https-proxy?
-# if you want to tunnel other protokols, set to false
+# if you want to tunnel other protocols, set to false
secureHttps = true
# specifies if the httpdFileHandler should cache
diff --git a/yacy.network.group b/yacy.network.group
new file mode 100644
index 000000000..2bf87d354
--- /dev/null
+++ b/yacy.network.group
@@ -0,0 +1,29 @@
+# YaCy Network Group Definition
+# -----------------------------
+# This is an addition to the yacy.network.unit configuration file.
+# This file is adressed by the network.group.definition property in yacy.init
+# The purpose of a group within a network is that some parts of a network may be managed independently,
+# while the content of the network stays private for the whole network, mostly for a special purpose.
+# This file needs to be configured if someone wants to participate with several peers to the network,
+# but wants to manage the group of own peers with a single master peer.
+# One example application would be the use of computing-teams
+
+# Defintion of property domains:
+# network.group.name =
+# network.group.description =
+# network.group.administration.control = 'uncontrolled'|'moderated'|'controlled'
+# network.group.administration.manager =
+# network.group.administration.request.authentification.method = 'salted-magic'
+# network.group.administration.request.authentification.essentials =
+
+# -----------------------------------------------------------------#
+# this is a work in progress. disabled properties are not yet used #
+# -----------------------------------------------------------------#
+
+# properties for group access administrator-authentification:
+#network.group.name = everybody
+#network.group.description = Our Peer-Group
+#network.group.administration.control = uncontrolled
+#network.group.administration.manager =
+#network.group.administration.request.authentification.method = salted-magic
+#network.group.administration.request.authentification.essentials =
\ No newline at end of file
diff --git a/yacy.network.unit b/yacy.network.unit
new file mode 100644
index 000000000..a877f1903
--- /dev/null
+++ b/yacy.network.unit
@@ -0,0 +1,72 @@
+# YaCy Network Unit Definition
+# ----------------------------
+# There is not only a single global YaCy network, but there can be also separated networks
+# This file describes the properties of the network, how it is bootstraped, if it is moderated
+# and so on. It is also possible to describe authentification methods for in-protocol communication
+# To distinguish between index areas where the shared web index is for a intranet or the public internet,
+# we distinguish local and global networks. Each network type can have different user groups.
+# Groups can be uncontrolled, moderated or controlled. The whole network may also have a global master.
+# This file is adressed by the network.unit.definition property in yacy.init. If necessary this
+# property can also address a URL where a network definition file can be hosted, so that a network
+# can easily be moderated from a single central. In case of the public network of all independent peers
+# for global indexing, the network definition is attached to the release and defines no network master or
+# any other supervision.
+
+# peer-to-peer construction using the bootstrap properties:
+# 1st: a file within every distribution that has a list of URLs,
+# or a location with a file containing a list of URLs:
+# -> these are the superseed files (there are only two of these files)
+# 2nd: the files that can be retrieved by the superseeds' URLs
+# are called seed list-files. (there can be many of those)
+# -> the seed list-files contain b.o. IP/port combinations of running YaCy peers
+# -> seed-list files are written by principal peers
+
+# Control Modes for Peer Groups:
+# we have three different types of moderation:
+# uncontrolled: only the peer's administrator may use protected pages of the YaCy interface
+# moderated : the unit/group moderator may access some protected pages i.e. Crawl Start
+# controlled : the unit/group moderator may access all pages of the peers within the same unit/group
+
+# Defintion of property domains:
+# network.unit.name =
+# network.unit.description =
+# network.unit.domain = 'global'|'local'
+# network.unit.dhtredundancy =
+# network.unit.bootstrap.file =
+# network.unit.bootstrap.url =
+# network.unit.protocol.control = 'uncontrolled'|'moderated'|'controlled'
+# network.unit.protocol.request.authentification.method = 'salted-magic'
+# network.unit.protocol.request.authentification.essentials =
+# network.unit.protocol.response.authentification.method = 'challenge-pwresponse'
+# network.unit.protocol.response.authentification.essentials = ':'
+# network.unit.administration.control = 'uncontrolled'|'moderated'|'controlled'
+# network.unit.administration.manager =
+# network.unit.administration.request.authentification.method = 'salted-magic'
+# network.unit.administration.request.authentification.essentials =
+
+
+# -----------------------------------------------------------------#
+# this is a work in progress. disabled properties are not yet used #
+# -----------------------------------------------------------------#
+
+# general network definition
+network.unit.name = freeworld
+network.unit.description = Public YaCy Community
+#network.unit.domain = global
+network.unit.dhtredundancy.junior = 1
+network.unit.dhtredundancy.senior = 3
+network.unit.bootstrap.file = superseed.txt
+network.unit.bootstrap.url = http://www.yacy.net/superseed.txt
+
+# properties for in-protocol response authentification:
+#network.unit.protocol.control = uncontrolled
+#network.unit.protocol.request.authentification.method = salted-magic
+#network.unit.protocol.request.authentification.essentials =
+#network.unit.protocol.response.authentification.method = challenge-pwresponse
+#network.unit.protocol.response.authentification.essentials =
+
+# properties for unit access administrator-authentification:
+#network.unit.administration.control = uncontrolled
+#network.unit.administration.manager =
+#network.unit.administration.request.authentification.method = salted-magic
+#network.unit.administration.request.authentification.essentials =