Beispiel #1
0
        private static DashboardUI MakeUiModel(DashboardModel model, ViewType[] viewTypes)
        {
            DashboardUI result = new DashboardUI();

            foreach (View v in model.Views)
            {
                ViewType viewType = viewTypes.FirstOrDefault(vt => vt.Name.Equals(v.Type, StringComparison.InvariantCultureIgnoreCase));
                if (viewType == null)
                {
                    throw new Exception($"No view type '{v.Type}' found!");
                }

                bool url = viewType.Type == typeof(View_ExtURL);

                var viewInstance = new ViewInstance()
                {
                    viewID    = v.ID,
                    viewName  = v.Name,
                    viewURL   = url ? v.Config.Object <ViewURLConfig>() !.URL : viewType.HtmlPath,
                    viewIcon  = viewType.Icon,
                    viewGroup = v.Group,
                    viewType  = v.Type,
                };

                result.views.Add(viewInstance);
            }
            return(result);
        }
Beispiel #2
0
        public override async Task Init(ModuleInitInfo info,
                                        VariableValue[] restoreVariableValues,
                                        Notifier notifier,
                                        ModuleThread moduleThread)
        {
            theSyncContext = SynchronizationContext.Current;

            await base.Init(info, restoreVariableValues, notifier, moduleThread);

            var config = info.GetConfigReader();

            clientPort = info.LoginPort;

            string baseDir = config.GetString("base-dir");
            string host    = config.GetString("listen-host");
            int    port    = config.GetInt("listen-port");

            string strViewAssemblies = config.GetString("view-assemblies");

            const string releaseDebugPlaceHolder = "{RELEASE_OR_DEBUG}";

            if (strViewAssemblies.Contains(releaseDebugPlaceHolder))
            {
#if DEBUG
                strViewAssemblies = strViewAssemblies.Replace(releaseDebugPlaceHolder, "Debug");
#else
                strViewAssemblies = strViewAssemblies.Replace(releaseDebugPlaceHolder, "Release");
#endif
            }

            string[] viewAssemblies = strViewAssemblies
                                      .Split(new char[] { ';', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries)
                                      .Select(s => s.Trim())
                                      .ToArray();

            absolutBaseDir = Path.GetFullPath(baseDir);
            if (!Directory.Exists(absolutBaseDir))
            {
                throw new Exception($"base-dir does not exist: {absolutBaseDir}");
            }

            string[] absoluteViewAssemblies = viewAssemblies.Select(d => Path.GetFullPath(d)).ToArray();
            foreach (string dir in absoluteViewAssemblies)
            {
                if (!File.Exists(dir))
                {
                    throw new Exception($"view-assembly does not exist: {dir}");
                }
            }

            viewTypes = ReadAvailableViewTypes(absolutBaseDir, BundlesPrefix, absoluteViewAssemblies);
            uiModel   = MakeUiModel(model, viewTypes);

            var builder = new WebHostBuilder();
            builder.UseKestrel((KestrelServerOptions options) => {
                if (host.Equals("localhost", StringComparison.InvariantCultureIgnoreCase))
                {
                    options.ListenLocalhost(port);
                }
                else
                {
                    options.Listen(IPAddress.Parse(host), port);
                }
            });
            builder.UseWebRoot(absolutBaseDir);
            builder.UseStartup <Module>();
            //builder.ConfigureLogging(logging => {
            //    logging.AddConsole(); // Microsoft.Extensions.Logging.Console
            //    logging.SetMinimumLevel(LogLevel.Information);
            //});
            webHost = builder.Build();
            webHost.Start();
        }
Beispiel #3
0
        private async Task <ReqResult> HandlePost(HttpRequest request, HttpResponse response)
        {
            string path = request.Path;

            try {
                if (path == Path_Login)
                {
                    string?user;
                    string?pass;
                    using (var reader = new StreamReader(request.Body, Encoding.UTF8)) {
                        var obj = await StdJson.JObjectFromReaderAsync(reader);

                        user = (string?)obj["user"];
                        pass = (string?)obj["pass"];
                        if (user == null || pass == null)
                        {
                            return(ReqResult.Bad("Missing user and password."));
                        }
                    }

                    var        session = new Session();
                    Connection connection;
                    try {
                        connection = await HttpConnection.ConnectWithUserLogin("localhost", clientPort, user, pass, null, session, timeoutSeconds : 90);
                    }
                    catch (Exception exp) {
                        logWarn(exp.Message);
                        return(ReqResult.Bad(exp.Message));
                    }
                    await session.SetConnection(connection, model, moduleID, viewTypes);

                    sessions[session.ID] = session;

                    var result = new JObject();
                    result["sessionID"] = session.ID;
                    string str = StdJson.ObjectToString(uiModel);
                    JRaw   raw = new JRaw(str);
                    result["model"] = raw;
                    return(ReqResult.OK(result));
                }
                else if (path.StartsWith(Path_ViewReq))
                {
                    string viewRequest = path.Substring(Path_ViewReq.Length);

                    (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString());

                    string content;
                    using (var reader = new StreamReader(request.Body, Encoding.UTF8)) {
                        content = await reader.ReadToEndAsync();
                    }
                    return(await session.OnViewCommand(viewID, viewRequest, DataValue.FromJSON(content)));
                }
                else if (path == Path_ActivateView)
                {
                    (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString());
                    await session.OnActivateView(viewID);

                    return(ReqResult.OK());
                }
                else if (path == Path_DuplicateView)
                {
                    (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString());
                    string newViewID = await session.OnDuplicateView(viewID);

                    uiModel = MakeUiModel(model, viewTypes);

                    return(ReqResult.OK(new {
                        newViewID,
                        model = uiModel
                    }));
                }
                else if (path == Path_DuplicateConvertView)
                {
                    (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString());
                    string newViewID = await session.OnDuplicateConvertHistoryPlot(viewID);

                    uiModel = MakeUiModel(model, viewTypes);

                    return(ReqResult.OK(new {
                        newViewID,
                        model = uiModel
                    }));
                }
                else if (path == Path_RenameView)
                {
                    (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString());

                    string?newViewName;
                    using (var reader = new StreamReader(request.Body, Encoding.UTF8)) {
                        var obj = await StdJson.JObjectFromReaderAsync(reader);

                        newViewName = (string?)obj["newViewName"];
                        if (newViewName == null)
                        {
                            return(ReqResult.Bad("Missing newViewName"));
                        }
                    }

                    await session.OnRenameView(viewID, newViewName);

                    uiModel = MakeUiModel(model, viewTypes);

                    return(ReqResult.OK(new {
                        model = uiModel
                    }));
                }
                else if (path == Path_MoveView)
                {
                    (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString());

                    bool up = false;
                    using (var reader = new StreamReader(request.Body, Encoding.UTF8)) {
                        var obj = await StdJson.JObjectFromReaderAsync(reader);

                        up = (bool)obj["up"] !;
                    }

                    await session.OnMoveView(viewID, up);

                    uiModel = MakeUiModel(model, viewTypes);

                    return(ReqResult.OK(new {
                        model = uiModel
                    }));
                }
                else if (path == Path_DeleteView)
                {
                    (Session session, string viewID) = GetSessionFromQuery(request.QueryString.ToString());
                    await session.OnDeleteView(viewID);

                    uiModel = MakeUiModel(model, viewTypes);

                    return(ReqResult.OK(new {
                        model = uiModel
                    }));
                }
                else if (path == Path_Logout)
                {
                    string sessionID;
                    using (var reader = new StreamReader(request.Body, Encoding.UTF8)) {
                        sessionID = await reader.ReadToEndAsync();
                    }

                    if (sessions.ContainsKey(sessionID))
                    {
                        Session session = sessions[sessionID];
                        var     ignored = session.Close();
                        sessions.Remove(sessionID);
                    }

                    return(ReqResult.OK());
                }
                else
                {
                    return(ReqResult.Bad("Invalid path: " + path));
                }
            }
            catch (InvalidSessionException exp) {
                logWarn("HandlePost: " + exp.Message);
                return(ReqResult.Bad(exp.Message));
            }
            catch (Exception exp) {
                logWarn("HandlePost:", exp);
                return(ReqResult.Bad(exp.Message));
            }
        }