added SRSC
This commit is contained in:
parent
cd6808e62c
commit
f8b226bae5
92
src/bin/srsc/CLI.hx
Normal file
92
src/bin/srsc/CLI.hx
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
package bin.srsc;
|
||||||
|
|
||||||
|
import kernel.net.Package.NetworkID;
|
||||||
|
import lib.RessourceNames;
|
||||||
|
import lib.CLIAppBase;
|
||||||
|
|
||||||
|
using tink.CoreApi;
|
||||||
|
|
||||||
|
class CLI extends CLIAppBase {
|
||||||
|
public function new() {
|
||||||
|
registerAsyncSubcommand("get", (args) -> {
|
||||||
|
if (args.length < 2) {
|
||||||
|
handle.writeLine("Not enough arguments");
|
||||||
|
return Future.sync(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
var id:NetworkID = Std.parseInt(args[0]);
|
||||||
|
if (id == null) {
|
||||||
|
handle.writeLine("Invalid id");
|
||||||
|
return Future.sync(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return RessourceNames.get(args[1], id).map((res) -> {
|
||||||
|
switch (res) {
|
||||||
|
case Success(data):
|
||||||
|
if (data == null) {
|
||||||
|
handle.writeLine("Not found");
|
||||||
|
} else {
|
||||||
|
handle.writeLine("Found: " + data);
|
||||||
|
}
|
||||||
|
case Failure(error):
|
||||||
|
handle.writeLine("Error: " + error);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}, "<id> <name>");
|
||||||
|
|
||||||
|
registerAsyncSubcommand("register", (args) -> {
|
||||||
|
if (args.length < 3) {
|
||||||
|
handle.writeLine("Not enough arguments");
|
||||||
|
return Future.sync(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
var id:NetworkID = Std.parseInt(args[0]);
|
||||||
|
if (id == null) {
|
||||||
|
handle.writeLine("Invalid id");
|
||||||
|
return Future.sync(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
var id2:NetworkID = Std.parseInt(args[2]);
|
||||||
|
if (id2 == null) {
|
||||||
|
handle.writeLine("Invalid id");
|
||||||
|
return Future.sync(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return RessourceNames.register(args[1], id2, id).map((res) -> {
|
||||||
|
switch (res) {
|
||||||
|
case Success(data):
|
||||||
|
handle.writeLine("Success");
|
||||||
|
case Failure(error):
|
||||||
|
handle.writeLine("Error: " + error);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}, "<id> <name> <id>");
|
||||||
|
|
||||||
|
registerAsyncSubcommand("unregister", (args) -> {
|
||||||
|
if (args.length < 2) {
|
||||||
|
handle.writeLine("Not enough arguments");
|
||||||
|
return Future.sync(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
var id:NetworkID = Std.parseInt(args[0]);
|
||||||
|
if (id == null) {
|
||||||
|
handle.writeLine("Invalid id");
|
||||||
|
return Future.sync(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return RessourceNames.unregister(args[1], id).map((res) -> {
|
||||||
|
switch (res) {
|
||||||
|
case Success(data):
|
||||||
|
handle.writeLine("Success");
|
||||||
|
case Failure(error):
|
||||||
|
handle.writeLine("Error: " + error);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}, "<id> <name>");
|
||||||
|
}
|
||||||
|
}
|
32
src/bin/srsc/PackageTypes.hx
Normal file
32
src/bin/srsc/PackageTypes.hx
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
package bin.srsc;
|
||||||
|
|
||||||
|
import kernel.net.Package.NetworkID;
|
||||||
|
|
||||||
|
typedef GetRequest = {
|
||||||
|
public var ?type:String;
|
||||||
|
public var name:String;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef GetResponse = {
|
||||||
|
public var success:Bool;
|
||||||
|
public var netID:NetworkID;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef RegisterRequest = {
|
||||||
|
public var ?type:String;
|
||||||
|
public var name:String;
|
||||||
|
public var netID:NetworkID;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef RegisterResponse = {
|
||||||
|
public var success:Bool;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef UnregisterRequest = {
|
||||||
|
public var ?type:String;
|
||||||
|
public var name:String;
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef UnregisterResponse = {
|
||||||
|
public var success:Bool;
|
||||||
|
}
|
104
src/bin/srsc/SiteRessourceController.hx
Normal file
104
src/bin/srsc/SiteRessourceController.hx
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
package bin.srsc;
|
||||||
|
|
||||||
|
import kernel.log.Log;
|
||||||
|
import lib.KVStore;
|
||||||
|
import bin.srsc.PackageTypes;
|
||||||
|
import kernel.net.Package;
|
||||||
|
import kernel.ps.ProcessHandle;
|
||||||
|
import kernel.ps.Process;
|
||||||
|
|
||||||
|
/**
|
||||||
|
The SiteRessourceController is responsible for the management of ressources on the site.
|
||||||
|
It makes sure that ressources are have a unique id and that they are not duplicated.
|
||||||
|
It also keeps track of the responsible NetID for each ressource. Kinda like a DNS.
|
||||||
|
**/
|
||||||
|
class SiteRessourceController implements Process {
|
||||||
|
public static inline final SITE_CONTROLLER_RESSOURCE_MANAGER_PROTO:String = "srsc";
|
||||||
|
|
||||||
|
private var handle:ProcessHandle;
|
||||||
|
private var ressources:Map<String, NetworkID>;
|
||||||
|
|
||||||
|
public function new() {}
|
||||||
|
|
||||||
|
public function run(handle:ProcessHandle) {
|
||||||
|
this.handle = handle;
|
||||||
|
|
||||||
|
load();
|
||||||
|
|
||||||
|
// Register proto
|
||||||
|
kernel.net.Net.instance.registerProto(SITE_CONTROLLER_RESSOURCE_MANAGER_PROTO, this.handleMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function handleMsg(pkg:Package) {
|
||||||
|
/*
|
||||||
|
There are 3 types of messages:
|
||||||
|
- Register a new ressource name
|
||||||
|
- Unregister a ressource name
|
||||||
|
- Get the responsible NetID for a ressource name
|
||||||
|
*/
|
||||||
|
|
||||||
|
switch (pkg.data.type) {
|
||||||
|
case "register":
|
||||||
|
pkg.respond(handleRegister(pkg.data));
|
||||||
|
case "unregister":
|
||||||
|
pkg.respond(handleUnregister(pkg.data));
|
||||||
|
case "get":
|
||||||
|
pkg.respond(handleGet(pkg.data));
|
||||||
|
default:
|
||||||
|
handle.writeLine("Unknown message type: " + pkg.data.type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function handleGet(data:GetRequest):GetResponse {
|
||||||
|
var res = get(data.name);
|
||||||
|
return {success: res != null, netID: res};
|
||||||
|
}
|
||||||
|
|
||||||
|
private function handleRegister(data:RegisterRequest):RegisterResponse {
|
||||||
|
var res = register(data.name, data.netID);
|
||||||
|
return {success: res};
|
||||||
|
}
|
||||||
|
|
||||||
|
private function handleUnregister(data:UnregisterRequest):UnregisterResponse {
|
||||||
|
unregister(data.name);
|
||||||
|
return {success: true};
|
||||||
|
}
|
||||||
|
|
||||||
|
public function register(name:String, netID:NetworkID):Bool {
|
||||||
|
if (ressources.exists(name) && ressources.get(name) != netID) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
ressources.set(name, netID);
|
||||||
|
save();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function unregister(name:String) {
|
||||||
|
if (ressources.exists(name)) {
|
||||||
|
ressources.remove(name);
|
||||||
|
}
|
||||||
|
save();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function get(name:String):Null<NetworkID> {
|
||||||
|
return ressources.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function load() {
|
||||||
|
var store = KVStore.getStoreForClass();
|
||||||
|
var data:Null<Map<String, NetworkID>> = store.get("ressources");
|
||||||
|
|
||||||
|
if (data != null) {
|
||||||
|
this.ressources = data;
|
||||||
|
} else {
|
||||||
|
this.ressources = new Map<String, NetworkID>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function save() {
|
||||||
|
var store = KVStore.getStoreForClass();
|
||||||
|
store.set("ressources", this.ressources);
|
||||||
|
store.save();
|
||||||
|
}
|
||||||
|
}
|
@ -16,6 +16,8 @@ class DCEHack {
|
|||||||
new bin.Terminal(),
|
new bin.Terminal(),
|
||||||
new bin.Turtle(),
|
new bin.Turtle(),
|
||||||
new bin.HelloWorldService(),
|
new bin.HelloWorldService(),
|
||||||
|
new bin.srsc.SiteRessourceController(),
|
||||||
|
new bin.srsc.CLI(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package kernel.binstore;
|
package kernel.binstore;
|
||||||
|
|
||||||
|
import bin.srsc.CLI;
|
||||||
|
import bin.srsc.SiteRessourceController;
|
||||||
import bin.HelloWorldService;
|
import bin.HelloWorldService;
|
||||||
import bin.Service;
|
import bin.Service;
|
||||||
import bin.LSPS;
|
import bin.LSPS;
|
||||||
@ -27,7 +29,9 @@ class BinStore {
|
|||||||
{c: Turtle, name: "Turtle", aliases: ["turtle"]},
|
{c: Turtle, name: "Turtle", aliases: ["turtle"]},
|
||||||
{c: LSPS, name: "PM", aliases: ["lsps"]},
|
{c: LSPS, name: "PM", aliases: ["lsps"]},
|
||||||
{c: Service, name: "Service", aliases: ["service","srv"]},
|
{c: Service, name: "Service", aliases: ["service","srv"]},
|
||||||
{c: HelloWorldService, name: "HelloWorldService", aliases: ["hello-service"] }
|
{c: HelloWorldService, name: "HelloWorldService", aliases: ["hello-service"] },
|
||||||
|
{c: SiteRessourceController, name: "SiteRessourceController", aliases: ["srsc"]},
|
||||||
|
{c: CLI, name: "SRSC CLI", aliases: ["srsc-cli"]}
|
||||||
];
|
];
|
||||||
|
|
||||||
@:allow(kernel.Init)
|
@:allow(kernel.Init)
|
||||||
|
66
src/lib/RessourceNames.hx
Normal file
66
src/lib/RessourceNames.hx
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
package lib;
|
||||||
|
|
||||||
|
import bin.srsc.PackageTypes.UnregisterRequest;
|
||||||
|
import kernel.log.Log;
|
||||||
|
import bin.srsc.PackageTypes.RegisterRequest;
|
||||||
|
import bin.srsc.PackageTypes.GetRequest;
|
||||||
|
import bin.srsc.SiteRessourceController;
|
||||||
|
import kernel.net.Net;
|
||||||
|
import kernel.net.Package.NetworkID;
|
||||||
|
|
||||||
|
using tink.CoreApi;
|
||||||
|
|
||||||
|
class RessourceNames {
|
||||||
|
private static final SITE_CONTROLLER:NetworkID = 0; // Temporary TODO: Change to real ID
|
||||||
|
|
||||||
|
public static function get(name: String, controllerID: NetworkID = -1): Promise<Null<NetworkID>> {
|
||||||
|
if (controllerID == -1) controllerID = SITE_CONTROLLER;
|
||||||
|
|
||||||
|
var payload: GetRequest = {name: name, type: "get"};
|
||||||
|
|
||||||
|
return Net.instance.sendAndAwait(
|
||||||
|
SITE_CONTROLLER,
|
||||||
|
SiteRessourceController.SITE_CONTROLLER_RESSOURCE_MANAGER_PROTO,
|
||||||
|
payload
|
||||||
|
).map((res)->{
|
||||||
|
switch (res){
|
||||||
|
case Success(pkg):
|
||||||
|
return Success(pkg.data.netID);
|
||||||
|
case Failure(error):
|
||||||
|
return Failure(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function register(name: String, netID: NetworkID, controllerID: NetworkID = -1): Promise<Bool> {
|
||||||
|
if (controllerID == -1) controllerID = SITE_CONTROLLER;
|
||||||
|
|
||||||
|
var payload: RegisterRequest = {name: name, netID: netID, type: "register"};
|
||||||
|
|
||||||
|
return Net.instance.sendAndAwait(
|
||||||
|
SITE_CONTROLLER,
|
||||||
|
SiteRessourceController.SITE_CONTROLLER_RESSOURCE_MANAGER_PROTO,
|
||||||
|
payload
|
||||||
|
).map((res)->{
|
||||||
|
switch (res){
|
||||||
|
case Success(pkg):
|
||||||
|
return Success(pkg.data.success);
|
||||||
|
case Failure(error):
|
||||||
|
return Failure(error);
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function unregister(name: String, controllerID: NetworkID = -1): Promise<Noise> {
|
||||||
|
if (controllerID == -1) controllerID = SITE_CONTROLLER;
|
||||||
|
|
||||||
|
var payload: UnregisterRequest = {name: name, type: "unregister"};
|
||||||
|
|
||||||
|
return Net.instance.sendAndAwait(
|
||||||
|
SITE_CONTROLLER,
|
||||||
|
SiteRessourceController.SITE_CONTROLLER_RESSOURCE_MANAGER_PROTO,
|
||||||
|
payload
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user