Example #1
0
        private void ReadConfigFiles()
        {
            string path = Path.GetDirectoryName(this.GetType().Assembly.Location);

            if (path.EndsWith("" + Path.DirectorySeparatorChar) == false)
            {
                path += Path.DirectorySeparatorChar;
            }

            Global.EXEPath = path;
            // read settings
            if (File.Exists("settings.config"))
            {
                JSON.FillObject(new Global(), File.ReadAllText("settings.config"));
            }
            else
            {
                ServerCommands.SaveConfig();
            }
            foreach (var s in Global.Shares)
            {
                //if (s.id == null)
                //    s.id = Guid.NewGuid();
                if (s.ReadOnlyToken == "")
                {
                    s.ReadOnlyToken = Guid.NewGuid().ToString();
                }
                if (s.ReadWriteToken == "")
                {
                    s.ReadWriteToken = Guid.NewGuid().ToString();
                }
            }
            Global.isWindows = ("" + Environment.OSVersion).ToLower().Contains("windows");
        }
Example #2
0
        internal void Stop()
        {
            _log.Debug("Shutting down.");

            _webserver.Stop();

            _tcpserver.Stop();

            foreach (var q in _queprocessors)
            {
                q.Shutdown();
            }

            _timer.Stop();

            ServerCommands.SaveConfig();
            LogManager.Shutdown();
        }
Example #3
0
        private void RemoveQue(Connection cs)
        {
            var q = _queprocessors.Find(x => x.cs == cs);

            if (q != null)
            {
                _log.Debug($"deleting connection {cs.Name} to machine {cs.MachineName}");
                q.Shutdown();
                _queprocessors.Remove(q);

                Global.ConnectionList.Remove(cs);
                ServerCommands.SaveConnectionList();

                foreach (var f in Directory.GetFiles(cs.csfolder, cs.Name + ".*"))
                {
                    File.Delete(f);
                }
            }
        }
Example #4
0
        private object handler(object indata)
        {
            ReturnPacket ret = new ReturnPacket();

            ret.OK = false;
            try
            {
                Packet   request = (Packet)indata;
                COMMANDS c       = (COMMANDS)Enum.Parse(typeof(COMMANDS), request.Command);
                object[] p       = null;
                switch (c)
                {
                case COMMANDS.Download:
                    p        = (object[])request.Data;
                    ret.Data = ServerCommands.Download((string)p[0], (string)p[1], (SyncFile)p[2], (long)p[3], (int)p[4]);
                    ret.OK   = true;
                    break;

                case COMMANDS.GetServerInfo:
                    ret.Data = ServerCommands.GetServerInfo();
                    ret.OK   = true;
                    break;

                case COMMANDS.isConfirmed:
                    p        = (object[])request.Data;
                    ret.Data = ServerCommands.isConfirmed((string)p[0], (string)p[1], (string)p[2]);
                    ret.OK   = true;
                    break;

                case COMMANDS.RegisterMachine:
                    p        = (object[])request.Data;
                    ret.Data = ServerCommands.RegisterMachine((string)p[0], (string)p[1], (string)p[2], StartQue);
                    ret.OK   = true;
                    break;

                case COMMANDS.SyncReadOnly:
                    p        = (object[])request.Data;
                    ret.Data = ServerCommands.SyncReadOnly(_queprocessors, (string)p[0], (string)p[1], (string)p[2], (State)p[3]);
                    ret.OK   = true;
                    break;

                case COMMANDS.SyncReadWrite:
                    p        = (object[])request.Data;
                    ret.Data = ServerCommands.SyncReadWrite(_queprocessors, (string)p[0], (string)p[1], (string)p[2], (State)p[3], (Delta)p[4]);
                    ret.OK   = true;
                    break;

                case COMMANDS.isChanged:
                    p        = (object[])request.Data;
                    ret.Data = isChanged((string)p[0], (string)p[1]);
                    ret.OK   = true;
                    break;

                case COMMANDS.CreateZip:
                    p        = (object[])request.Data;
                    ret.Data = ServerCommands.CreateZip((string)p[0], (string)p[1], (object[])p[2]);
                    ret.OK   = true;
                    break;

                case COMMANDS.DownloadZip:
                    p        = (object[])request.Data;
                    ret.Data = ServerCommands.DownloadZip((string)p[0], (string)p[1], (SyncFile)p[2], (long)p[3], (int)p[4]);
                    ret.OK   = true;
                    break;

                case COMMANDS.DeleteZip:
                    p = (object[])request.Data;
                    ServerCommands.DeleteZip((string)p[0], (string)p[1], (SyncFile)p[2]);
                    ret.OK = true;
                    break;

                case COMMANDS.CanConnect:
                    ret.Data = ServerCommands.CanConnect((string)request.Data);
                    ret.OK   = true;
                    break;
                }
            }
            catch (Exception ex)
            {
                ret.OK    = false;
                ret.Error = ex.ToString();
            }
            return(ret);
        }
Example #5
0
        private void NewSync()
        {
            lock (_lock)
            {
                if (ClientCommands.isConnected(_conn.MachineName) == false)
                {
                    return;
                }
                if (_conn.isConfirmed == false)
                {
                    _conn.isConfirmed = ClientCommands.isConfirmed(_conn);
                    _conn.isPaused    = false;
                    ServerCommands.SaveConnection(_conn);
                }
                if (_que.Count > 0)
                {
                    return;
                }

                if (_conn.ReadyForSync())
                {
                    if (_conn.ReadOnly)
                    {
                        if (ClientCommands.isChanged(_conn) || _conn.isChanged)
                        {
                            _log.Info("syncing readonly : " + _conn.Name);
                            var state = DeltaProcessor.GetCurrentState(_conn.Path, _conn);
                            _connInfo.TotalFileCount = state.Files.Count;
                            var d = ClientCommands.SyncMeReadonly(state, _conn);
                            if (d != null)
                            {
                                QueueDelta(d);
                                _conn.isChanged = false;
                            }
                        }
                    }
                    else
                    {
                        if (ClientCommands.isChanged(_conn) || _conn.isChanged)
                        {
                            _log.Info("syncing read write : " + _conn.Name);
                            var laststate = DeltaProcessor.GetLastState(_conn);
                            // sync read write
                            var state = DeltaProcessor.GetCurrentState(_conn.Path, _conn);
                            _connInfo.TotalFileCount = state.Files.Count;
                            var delta = DeltaProcessor.ComputeDelta(state, laststate);
                            if (laststate.Files.Count > 0 || laststate.Folders.Count > 0)
                            {
                                delta.FilesChanged = new List <SyncFile>();
                                delta.FilesAdded   = new List <SyncFile>();
                            }

                            var d = ClientCommands.SyncMeReadWrite(state, delta, _conn);
                            if (d != null)
                            {
                                QueueDelta(d);
                                _conn.isChanged = false;
                                DeltaProcessor.SaveState(_conn, state);
                            }
                        }
                    }
                }

                SaveQueue();
            }
        }
Example #6
0
        public override void InitializeCommandHandler(Dictionary <string, Handler> handler, Dictionary <string, string> apihelp)
        {
            var jp = new JSONParameters {
                UseExtensions = false, UseFastGuid = false, EnableAnonymousTypes = true
            };

            handler.Add("createshare", ctx => // ? sharename & path
            {
                OutPutContentType(ctx, "*.json");
                string str = ctx.Request.Url.GetComponents(UriComponents.Query, UriFormat.Unescaped);
                var s      = str.Split('&');
                var sh     = s[0];
                var path   = s[1];
                if (path.EndsWith("" + Path.DirectorySeparatorChar) == false)
                {
                    path += Path.DirectorySeparatorChar;
                }

                var f = Global.Shares.Find(x => x.Name.ToLower() == sh.ToLower());
                if (f == null)
                {
                    Share ns = new Share();
                    ns.Name  = sh;
                    ns.Path  = path;
                    Global.Shares.Add(ns);
                    ServerCommands.SaveConfig();

                    WriteResponse(ctx, 200, "true");
                    return;
                }
                WriteResponse(ctx, 200, "false");
            });

            handler.Add("connect", ctx => //  ? token  & path
            {
                OutPutContentType(ctx, "*.json");
                string str = ctx.Request.Url.GetComponents(UriComponents.Query, UriFormat.Unescaped);
                var ss     = str.Split('&');
                var c      = ClientCommands.CanConnect(ss[0].Trim());
                if (c != null)
                {
                    var cc = ClientCommands.Connect(c.MachineName, c.Name, c.Token);
                    if (cc != "")
                    {
                        c.Path = ss[1].Trim();
                        if (c.Path.EndsWith("" + Path.DirectorySeparatorChar) == false)
                        {
                            c.Path += Path.DirectorySeparatorChar;
                        }

                        if (ServerCommands.Connect(c) != "")
                        {
                            StartQue(c);
                            WriteResponse(ctx, 200, "true");
                            return;
                        }
                    }
                }
                WriteResponse(ctx, 200, "false");
            });

            handler.Add("connection.confirm", ctx => // ? machinename & share & bool
            {
                OutPutContentType(ctx, "*.json");
                string str = ctx.Request.Url.GetComponents(UriComponents.Query, UriFormat.Unescaped);
                var s      = str.Split('&');
                var mn     = s[0];
                var sh     = s[1];
                var t      = s[2];
                var f      = Global.ConnectionList.Find(x => x.MachineName == mn && x.Name == sh);
                if (f != null)
                {
                    f.isConfirmed = t.ToLower() == "true" || t.ToLower() == "t";

                    ServerCommands.SaveConnectionList();

                    WriteResponse(ctx, 200, "true");
                    return;
                }
                WriteResponse(ctx, 200, "false");
            });

            handler.Add("connection.remove", ctx => // ? machinename & share
            {
                OutPutContentType(ctx, "*.json");
                string str = ctx.Request.Url.GetComponents(UriComponents.Query, UriFormat.Unescaped);
                var s      = str.Split('&');
                var mn     = s[0];
                var sh     = s[1];
                var f      = Global.ConnectionList.Find(x => x.MachineName == mn && x.Name == sh);
                if (f != null)
                {
                    RemoveQue(f);

                    WriteResponse(ctx, 200, "true");
                    return;
                }
                WriteResponse(ctx, 200, "false");
            });

            handler.Add("connection.getinfo", ctx => // ? machine & share
            {
                OutPutContentType(ctx, "*.json");
                string str = ctx.Request.Url.GetComponents(UriComponents.Query, UriFormat.Unescaped);
                var s      = str.Split('&');
                var mn     = s[0];
                var sh     = s[1];
                var f      = Global.ConnectionList.Find(x => x.MachineName == mn && x.Name == sh);
                if (f != null)
                {
                    var o = GetConnInfo(f);
                    var j = JSON.ToJSON(o, jp);

                    WriteResponse(ctx, 200, j);
                    return;
                }
                WriteResponse(ctx, 200, "{}");
            });

            handler.Add("connection.pauseresume", ctx => // ? machinename & share & true
            {
                OutPutContentType(ctx, "*.json");
                string str = ctx.Request.Url.GetComponents(UriComponents.Query, UriFormat.Unescaped);
                var ss     = str.Split('&');

                var cs = Global.ConnectionList.Find(x => x.MachineName == ss[0].Trim() && x.Name == ss[1].Trim());
                if (cs != null)
                {
                    cs.isPaused = ss[2].Trim() == "true" ? true : false;
                    ServerCommands.SaveConnectionList();

                    WriteResponse(ctx, 200, "true");
                    return;
                }

                WriteResponse(ctx, 200, "false");
            });

            handler.Add("share.pauseresume", ctx => // ? share & true
            {
                OutPutContentType(ctx, "*.json");
                string str = ctx.Request.Url.GetComponents(UriComponents.Query, UriFormat.Unescaped);
                var ss     = str.Split('&');

                var s = Global.Shares.Find(x => x.Name == ss[0].Trim());
                if (s != null)
                {
                    foreach (var cs in Global.ConnectionList.FindAll(x => x.Name == ss[0].Trim()))
                    {
                        cs.isPaused = ss[1].Trim() == "true" ? true : false;
                    }
                    ServerCommands.SaveConnectionList();
                    WriteResponse(ctx, 200, "true");
                    return;
                }
                WriteResponse(ctx, 200, "false");
            });

            handler.Add("share.add", ctx =>
            {
                OutPutContentType(ctx, "*.json");
                string text = null;
                using (var reader = new StreamReader(ctx.Request.InputStream, Encoding.UTF8))
                {
                    text = reader.ReadToEnd();
                }

                var o = JSON.ToObject <Share>(text);
                var s = Global.Shares.Find(x => x.Name == o.Name);
                if (s == null)
                {
                    if (o.Path.EndsWith("" + Path.DirectorySeparatorChar) == false)
                    {
                        o.Path += Path.DirectorySeparatorChar;
                    }
                    Global.Shares.Add(o);

                    ServerCommands.SaveConfig();

                    WriteResponse(ctx, 200, "true");
                    return;
                }
                WriteResponse(ctx, 200, "false");
            });

            handler.Add("share.remove", ctx => // ? sharename
            {
                OutPutContentType(ctx, "*.json");
                string str = ctx.Request.Url.GetComponents(UriComponents.Query, UriFormat.Unescaped);

                var sh = Global.Shares.Find(x => x.Name == str.Trim());
                if (sh != null)
                {
                    Global.Shares.Remove(sh);

                    // remove connections also
                    foreach (var c in Global.ConnectionList.FindAll(x => x.Name == str.Trim()))
                    {
                        RemoveQue(c);
                    }

                    ServerCommands.SaveConfig();

                    WriteResponse(ctx, 200, "true");
                    return;
                }
                WriteResponse(ctx, 200, "false");
            });

            handler.Add("getshares", ctx =>
            {
                OutPutContentType(ctx, "*.json");
                WriteResponse(ctx, 200, fastJSON.JSON.ToJSON(Global.Shares, jp));
            });

            handler.Add("getconnections", ctx =>
            {
                OutPutContentType(ctx, "*.json");
                WriteResponse(ctx, 200, fastJSON.JSON.ToJSON(Global.ConnectionList, jp));
            });

            handler.Add("pausets", ctx => // ? 0 or 1
            {
                string str = ctx.Request.Url.GetComponents(UriComponents.Query, UriFormat.Unescaped);
                if (str == "1")
                {
                    Global.PauseAll = true;
                }
                else
                {
                    Global.PauseAll = false;
                }
                OutPutContentType(ctx, ".json");
                WriteResponse(ctx, 200, "true");
            });

            handler.Add("getlogs", ctx =>
            {
                OutPutContentType(ctx, ".json");
                WriteResponse(ctx, 200, JSON.ToJSON(LogManager.GetLastLogs(), jp));
            });

            handler.Add("getconfigs", ctx =>
            {
                var o = new
                {
                    Version = FileVersionInfo.GetVersionInfo(this.GetType().Assembly.Location).FileVersion,
                    Globals = new Global(),
                    Global.FreeMemoryTimerMin,
                    Global.SaveQueueEvery_X_Minute,
                    Global.PauseAll
                };

                OutPutContentType(ctx, ".json");
                WriteResponse(ctx, 200, JSON.ToJSON(o, jp));
            });
        }