public async Task InvokeScheduler(FtpOption ftpOption)
        {
            var cancellationToken = CancellationToken.None;
            await StateManager.AddOrUpdateStateAsync(REMINDER_SCHEDULE, ftpOption, (s, key) => ftpOption,
                                                     cancellationToken);

            await RegisterReminderAsync(REMINDER_SCHEDULE, null, TimeSpan.FromSeconds(2),
                                        TimeSpan.FromSeconds(ftpOption.FtpConfig.Freq));
        }
 private async Task InitSchedulerActor(FtpOption ftpOption, CancellationToken cancellationToken)
 {
     try
     {
         cancellationToken.ThrowIfCancellationRequested();
         var actorId = ftpOption.FtpConfig.Ftp.Host + ftpOption.FtpConfig.Ftp.Path + ftpOption.FtpConfig.Freq;
         await ChainNextActorsAsync <IDefaultFtpSchedulerAction>(c => c.InvokeScheduler(ftpOption), DefaultNextActorRequestContext, new OrchestrationOrder($"{ApplicationName}/{SchedulerActorService}", actorId).ToExecutableOrder(), cancellationToken);
     }
     catch (Exception ex)
     {
         Logger.LogError(ex, $"{CurrentActor} failed to init scheduler actor: " + ex.Message, ftpOption);
         throw;
     }
 }
Exemplo n.º 3
0
 private void InitSchedulerActor(FtpOption ftpOption, CancellationToken cancellationToken)
 {
     try
     {
         cancellationToken.ThrowIfCancellationRequested();
         var data  = MessagePackSerializer.Serialize(ftpOption);
         var proxy = ActorProxy.Create <IBaseMessagingActor>(new ActorId($"scheduler_{ftpOption.Domain}"),
                                                             new Uri($"{Context.CodePackageActivationContext.ApplicationName}/{SchedulerActorServiceName}"));
         proxy.ChainProcessMessageAsync(new ActorRequestContext(this.GetType().Name), data, cancellationToken);
     }
     catch (Exception e)
     {
         Logger.LogError(e, $"[InitSchedulerActor] Failed to init scheduler actor: " + e.Message, ftpOption);
         throw;
     }
 }
Exemplo n.º 4
0
        /// <summary>
        /// 检查路径
        /// </summary>
        /// <param name="relativeDir">虚拟目录</param>
        /// <param name="ftpOption">检查选项</param>
        /// <param name="localPath">本地路径</param>
        /// <returns>操作结果</returns>
        string GetLocalPath(string virtualPath, FtpOption option, out bool isFile)
        {
            string localPath = string.Empty;

            //保持与Unix文件系统一致
            virtualPath = virtualPath.Replace(new string(localPathSpliter, 1), new string(virtualPathSpliter, 1));
            virtualPath = virtualPath.Replace(new string(virtualPathSpliter, 2), new string(virtualPathSpliter, 1));

            if (string.IsNullOrEmpty(virtualPath))
            {
                if (option == FtpOption.List)
                {
                    virtualPath = Root;
                }
                else
                {
                    throw new DirectoryNotFoundException(virtualPath);
                }
            }
            else if (!virtualPath.StartsWith(Root))
            {
                if (!CurrentDir.EndsWith(virtualPathSpliter.ToString()))
                {
                    virtualPath = CurrentDir + virtualPathSpliter.ToString() + virtualPath;
                }
                else
                {
                    virtualPath = CurrentDir + virtualPath;
                }
            }

            //NetDebuger.PrintDebugMessage(this,"VIRTUAL PATH:"+virtualPath);
            bool exist = MapVirtualPathToLocalPath(virtualPath, out localPath, out isFile);

            //NetDebuger.PrintDebugMessage(this, "LOCAL PATH:" + localPath);

            //如果当前不是在生成新的文件和目录,就抛出路径不存在的异常
            if (!exist && (option != FtpOption.Create && option != FtpOption.Upload))
            {
                throw new DirectoryNotFoundException(virtualPath);
            }

            CheckAccess(virtualPath, localPath, option);

            return(localPath);
        }
        public async Task InvokeGenerateReadRequest(FtpOption ftpOption)
        {
            var ftpDispatchRequest = new DispatchRequest(ftpOption, typeof(FtpOption), ftpOption?.Domain, ReponseParserActor, null);

            //if using sb
            //await GenerateRequestAsync(ftpDispatchEvent);

            // testing only
            var newExecutableOrder = new ExecutableOrchestrationOrder()
            {
                ActorId         = GenerateActorId(),
                ActorServiceUri = (FtpDispatcherActorService != null) ? $"{ApplicationName}/{FtpDispatcherActorService}" : ServiceUri.ToString()
            };

            await ChainNextActorsAsync <IDefaultFtpDispatchAction>(
                c => c.InvokeDispatchReadRequest(ftpDispatchRequest),
                new ActorRequestContext(Id.ToString(),
                                        "FTP_READ_DISPATCH_ACTION_NAME",
                                        Guid.NewGuid().ToString(), CurrentFlowInstanceId), newExecutableOrder, CancellationToken.None);
        }
Exemplo n.º 6
0
        private void CheckAccess(string virtualPath, string localPath, FtpOption option)
        {
            //避免出现访问/../../..的缺陷
            if (localPath.IndexOf(user.HomeDir) == -1)
            {
                throw new DirectoryNotFoundException(virtualPath);
            }

            //不允许读取
            if ((option == FtpOption.List || option == FtpOption.Download))
            {
                if (!user.AllowRead)
                {
                    throw new AccessDeniedException(virtualPath);
                }
            }
            else //不允许写入
            {
                if (!user.AllowWrite)
                {
                    throw new AccessDeniedException(virtualPath);
                }
            }
        }