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; } }
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; } }
/// <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); }
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); } } }