public static string[] Run([ActivityTrigger] DurableActivityContext context, ILogger log,
                                   ExecutionContext executionContext)
        {
            //config and input
            _log = log;
            var    input          = new { Name = context.GetInput <string>() };
            var    config         = executionContext.BuildConfiguration();
            var    clientId       = config["ApplicationId"];
            var    clientSecret   = config["ApplicationSecret"];
            var    tenantId       = config["TenantId"];
            string subscriptionId = config["SubscriptionId"];

            log.LogInformation($"Get resources activity start {input.Name}");

            try
            {
                // authenticate and return names of VMSSs that start with the prefix
                if (!AzureCredentials.Make(tenantId, clientId, clientSecret, subscriptionId)
                    .TryGetAzure(out IAzure azure, message => _log.LogError(message)))
                {
                    return(Array.Empty <string>());
                }
                return(azure.GetVmssNames(input.Name).ToArray());
            }
            catch (Exception e)
            {
                _log.LogError($"Get resources activity error {e.Message}", e);
            }
            return(Array.Empty <string>());
        }
Exemple #2
0
        public static async Task <ChallengeResult> Http01Authorization([ActivityTrigger] DurableActivityContext context, ILogger log)
        {
            var(site, authzUrl) = context.GetInput <(Site, string)>();

            var acme = await CreateAcmeClientAsync();

            var authz = await acme.GetAuthorizationDetailsAsync(authzUrl);

            // HTTP-01 Challenge の情報を拾う
            var challenge = authz.Challenges.First(x => x.Type == "http-01");

            var challengeValidationDetails = AuthorizationDecoder.ResolveChallengeForHttp01(authz, challenge, acme.Signer);

            var websiteClient = await CreateWebSiteManagementClientAsync();

            var credentials = await websiteClient.WebApps.ListPublishingCredentialsAsync(site);

            // Kudu API を使い、Answer 用のファイルを作成
            var kuduClient = new KuduApiClient(site.ScmSiteUrl(), credentials.PublishingUserName, credentials.PublishingPassword);

            await kuduClient.WriteFileAsync(DefaultWebConfigPath, DefaultWebConfig);

            await kuduClient.WriteFileAsync(challengeValidationDetails.HttpResourcePath, challengeValidationDetails.HttpResourceValue);

            return(new ChallengeResult
            {
                Url = challenge.Url,
                HttpResourceUrl = challengeValidationDetails.HttpResourceUrl,
                HttpResourceValue = challengeValidationDetails.HttpResourceValue
            });
        }
Exemple #3
0
        public static async Task <(string, byte[])> FinalizeOrder([ActivityTrigger] DurableActivityContext context, ILogger log)
        {
            var(hostNames, orderDetails) = context.GetInput <(string[], OrderDetails)>();

            // ECC 256bit の証明書に固定
            var ec  = ECDsa.Create(ECCurve.NamedCurves.nistP256);
            var csr = CryptoHelper.Ec.GenerateCsr(hostNames, ec);

            var acme = await CreateAcmeClientAsync();

            // Order の最終処理を実行し、証明書を作成
            var finalize = await acme.FinalizeOrderAsync(orderDetails.Payload.Finalize, csr);

            var certificateData = await _httpClient.GetByteArrayAsync(finalize.Payload.Certificate);

            // 秘密鍵を含んだ形で X509Certificate2 を作成
            var(certificate, chainCertificate) = X509Certificate2Extension.LoadFromPem(certificateData);

            var certificateWithPrivateKey = certificate.CopyWithPrivateKey(ec);

            var x509Certificates = new X509Certificate2Collection(new[] { certificateWithPrivateKey, chainCertificate });

            // PFX 形式としてエクスポート
            return(certificateWithPrivateKey.Thumbprint, x509Certificates.Export(X509ContentType.Pfx, "P@ssw0rd"));
        }
Exemple #4
0
        public static string[] GetFileList([ActivityTrigger] DurableActivityContext ctx)
        {
            string directory = ctx.GetInput <string>();

            string[] files = Directory.GetFiles(directory, "*", SearchOption.TopDirectoryOnly);
            return(files);
        }
        public static async Task <ActivityResponse> SetLeagueEmailAddressCommandHandlerActivity(
            [ActivityTrigger] DurableActivityContext context,
            ILogger log)
        {
            ActivityResponse ret = new ActivityResponse()
            {
                FunctionName = "SetLeagueEmailAddressCommandHandlerActivity"
            };

            try
            {
                CommandRequest <Set_Email_Address_Definition> cmdRequest = context.GetInput <CommandRequest <Set_Email_Address_Definition> >();

                if (null != cmdRequest)
                {
                    await HandleSetLeagueEmailAddressCommand(cmdRequest.CommandUniqueIdentifier.ToString(), log,
                                                             new WriteContext(ret.FunctionName, context.InstanceId ));

                    ret.Message = $"Command processed {cmdRequest.CommandName} : {cmdRequest.CommandUniqueIdentifier}";
                }
                else
                {
                    ret.FatalError = true;
                    ret.Message    = $"Unable to read command request from {context.InstanceId }";
                }
            }
            catch (Exception ex)
            {
                ret.FatalError = true;
                ret.Message    = ex.Message;
            }

            return(ret);
        }
        public static async Task <ActivityResponse> RunWebHookNotificationActivity(
            [ActivityTrigger] DurableActivityContext context,
            Binder outputBinder,
            ILogger log)
        {
            ActivityResponse response = new ActivityResponse()
            {
                FunctionName = "RunWebHookNotificationActivity"
            };

            Command_Notification_Request notifyRequest = context.GetInput <Command_Notification_Request>();

            if (null != notifyRequest)
            {
                var payloadAsJSON = new StringContent(JsonConvert.SerializeObject(notifyRequest));

                // Use the binder to bind to an HTTP client to send the results to
                using (var client = new HttpClient())
                {
                    HttpResponseMessage msgResp = await client.PostAsync(notifyRequest.HookAddress, payloadAsJSON);

                    if (null != msgResp)
                    {
                        response.Message = $"Output sent - {msgResp.ReasonPhrase}";
                    }
                }
            }
            else
            {
                response.StepFailure = true;
                response.Message     = "Unable to read command notification request from context";
            }

            return(response);
        }
Exemple #7
0
        public static async Task FinalizeOrder([ActivityTrigger] DurableActivityContext context, ILogger log)
        {
            var(hostNames, orderDetails) = context.GetInput <(string[], OrderDetails)>();

            var certificateName = hostNames[0].Replace("*", "wildcard").Replace(".", "-");

            var keyVaultClient = CreateKeyVaultClient();

            // Key Vault を使って CSR を作成
            var request = await keyVaultClient.CreateCertificateAsync(Settings.Default.VaultBaseUrl, certificateName, new CertificatePolicy
            {
                X509CertificateProperties = new X509CertificateProperties
                {
                    SubjectAlternativeNames = new SubjectAlternativeNames(dnsNames: hostNames)
                }
            }, tags : new Dictionary <string, string>
            {
                { "Issuer", "letsencrypt.org" }
            });

            var acme = await CreateAcmeClientAsync();

            // Order の最終処理を実行し、証明書を作成
            var finalize = await acme.FinalizeOrderAsync(orderDetails.Payload.Finalize, request.Csr);

            var certificateData = await _httpClient.GetByteArrayAsync(finalize.Payload.Certificate);

            // X509Certificate2 を作成
            var certificate = new X509Certificate2(certificateData);

            await keyVaultClient.MergeCertificateAsync(Settings.Default.VaultBaseUrl, certificateName, new X509Certificate2Collection(certificate));
        }
 public static async Task <string> Worker(
     [ActivityTrigger] DurableActivityContext ctx,
     TraceWriter log
     )
 {
     return("");
 }
        public static string Activity([ActivityTrigger] DurableActivityContext context)
        {
            var payload = context.GetInput <string>();

            // This will be serialized and persisted to orchestration history
            return($"Hello {payload}!");
        }
Exemple #10
0
        public static string SayHello(
            [ActivityTrigger] DurableActivityContext helloContext)
        {
            string name = helloContext.GetInput <string>();

            return($"Hello {name}!");
        }
        public static async Task <string> ProcessVideo(
            [ActivityTrigger] DurableActivityContext ctx,
            TraceWriter log
            )
        {
            var url = ctx.GetInput <string>();
            var asm = Assembly.Load("Microsoft.Extensions.Options, Culture=neutral, PublicKeyToken=adb9793829ddae60");

            PuppeteerSharp.Browser browser = null;
            try
            {
                browser = await Puppeteer.ConnectAsync(new ConnectOptions { BrowserWSEndpoint = Constants.BrowserWSEndpoint });

                var page = await browser.NewPageAsync();

                await page.GoToAsync(url, new NavigationOptions { Timeout = 4000 });
            }
            catch (Exception ex)
            {
                return(ex.Message);
            }
            finally
            {
                if (browser != null)
                {
                    browser.Disconnect();
                }
            }
            return($"Processed {url} shit all.");
        }
        public static DataTable GetDataTable([ActivityTrigger] DurableActivityContext context, ILogger log)
        {
            var data = context.GetInput <dynamic>();

            DataTable dt = new DataTable((string)data.tableName);

            log.LogInformation($"attempting to get datatable {(string)data.tableName}");

            using (SqlConnection conn = new SqlConnection((string)data.connectionString))
            {
                using (SqlCommand cmd = new SqlCommand((string)data.queryString, conn))
                {
                    cmd.CommandTimeout = COMMAND_TIMEOUT;
                    cmd.CommandType    = CommandType.Text;

                    if (data.parameters != null)
                    {
                        cmd.Parameters.AddRange((SqlParameter[])data.parameters);
                    }

                    var adapter = new SqlDataAdapter(cmd);
                    adapter.Fill(dt);
                    return(dt);
                }
            }
        }
        public static int ExecuteQuery([ActivityTrigger] DurableActivityContext context, ILogger log)
        {
            var data = context.GetInput <dynamic>();

            using (SqlConnection conn = new SqlConnection((string)data.connectionString))
            {
                using (SqlCommand cmd = new SqlCommand((string)data.queryString, conn))
                {
                    cmd.CommandTimeout = COMMAND_TIMEOUT;
                    cmd.CommandType    = CommandType.Text;

                    if (data.parameters != null)
                    {
                        cmd.Parameters.AddRange((SqlParameter[])data.parameters);
                    }

                    //var adapter = new SqlDataAdapter(cmd);
                    //adapter.Fill(dt);
                    conn.Open();
                    var ret = cmd.ExecuteNonQuery();
                    conn.Close();
                    log.LogInformation($"successfully executed {(string)data.caption}");
                    return(ret);
                }
            }
        }
        public static string GetInventory([ActivityTrigger] DurableActivityContext inputs, TraceWriter log)
        {
            (string material, string supplyingPlant)materialInfo = inputs.GetInput <(string, string)>();

            string baseURL = "https://sandbox.api.sap.com/s4hanacloud/sap/opu/odata/sap/API_PRODUCT_AVAILY_INFO_BASIC/CalculateAvailabilityTimeseries?";
            string URL     = baseURL + "ATPCheckingRule='A'&Material='" + materialInfo.material + "'&SupplyingPlant='" + materialInfo.supplyingPlant + "'";

            var request = new HttpRequestMessage()
            {
                RequestUri = new Uri(URL),
                Method     = HttpMethod.Get
            };

            request.Headers.TryAddWithoutValidation("APIKey", S4HCAPIKey);
            request.Headers.TryAddWithoutValidation("Accept", "application/json");

            var result = client.SendAsync(request).Result;

            string jsonContent = result.Content.ReadAsStringAsync().Result;
            var    odata       = JsonConvert.DeserializeObject <OData>(jsonContent);

            log.Info($"Inventory level for {materialInfo.material} in {materialInfo.supplyingPlant} is {odata.d.Results[0].AvailableQuantityInBaseUnit}.");

            return(odata.d.Results[0].AvailableQuantityInBaseUnit);
        }
Exemple #15
0
        public static string Run([ActivityTrigger] DurableActivityContext ctx)
        {
            var input          = ctx.GetInput <string>();
            var recordsForYear = DecompressAndDeserialize(input);

            return(SerializeAndCompress(GetMedalsPerCountry(recordsForYear)));
        }
        public static async Task <ActivityResponse> GetLeagueSummaryQueryProjectionRequestActivity(
            [ActivityTrigger] DurableActivityContext context,
            ILogger log)
        {
            ActivityResponse ret = new ActivityResponse()
            {
                FunctionName = "GetLeagueSummaryQueryProjectionRequestActivity"
            };

            try
            {
                QueryRequest <Get_League_Summary_Definition> queryRequest = context.GetInput <QueryRequest <Get_League_Summary_Definition> >();

                if (null != log)
                {
                    log.LogInformation($"GetLeagueSummaryQueryProjectionRequestActivity called for query : {queryRequest.QueryUniqueIdentifier}");
                }


                await RequestProjectionsGetLeagueSummaryQuery(queryRequest.QueryName,
                                                              queryRequest.QueryUniqueIdentifier.ToString(),
                                                              log);

                ret.Message = $"Requested projections : { queryRequest.QueryUniqueIdentifier.ToString() } ";
            }
            catch (Exception ex)
            {
                ret.Message    = ex.Message;
                ret.FatalError = true;
            }
            return(ret);
        }
Exemple #17
0
        public static async Task BackupDocuments([ActivityTrigger] DurableActivityContext context, ILogger log)
        {
            var jobDef = context.GetInput <CollectionBackupJob>();
            var client = await GetClientAsync(jobDef.ConnectionString);

            var name = $"{client.ServiceEndpoint.Host} | {jobDef.CollectionLink}";

            log.LogInformation($"Initializing backup for {name}.");

            var dir = await GetDirectoryAsync(jobDef);

            using (var query = client.CreateDocumentQuery(jobDef.CollectionLink, new FeedOptions()
            {
                EnableCrossPartitionQuery = true
            }).AsDocumentQuery())
            {
                while (query.HasMoreResults)
                {
                    foreach (var doc in await query.ExecuteNextAsync <Document>())
                    {
                        var json = JsonConvert.SerializeObject(doc);

                        var docRef = dir.GetBlockBlobReference($"{doc.Id}.{doc.ResourceId}.json");

                        await docRef.UploadTextAsync(json);

                        log.LogMetric("Document.BackedUp", 1);
                    }
                }
            }

            log.LogInformation($"Completed backup for {name}.");
        }
Exemple #18
0
        public static async Task <bool> UpdateInventoryApi(
            [ActivityTrigger] DurableActivityContext ctx)
        {
            var orderDetail = ctx.GetInput <OrderDetail>();

            return(await UpdateInventory(orderDetail));
        }
Exemple #19
0
        public static async Task SendTemplates(
            [ActivityTrigger] DurableActivityContext context)
        {
            var input = context.GetInput <(string, List <string>)>();

            // テンプレート作成処理
            await lineMessagingClient.ReplyMessageAsync(input.Item1,
                                                        new List <ISendMessage>
            {
                FlexMessage.CreateBubbleMessage("セリフをタップしてね").SetBubbleContainer(
                    new BubbleContainer()
                    .SetHeader(BoxLayout.Horizontal)
                    .AddHeaderContents(new TextComponent
                {
                    Text    = "セリフをタップしてね",
                    Margin  = Spacing.Xs,
                    Size    = ComponentSize.Sm,
                    Align   = Align.Center,
                    Gravity = Gravity.Bottom,
                    Weight  = Weight.Bold
                })
                    .SetFooter(new BoxComponent(BoxLayout.Vertical)
                {
                    Spacing  = Spacing.Md, Flex = 0,
                    Contents = input.Item2.Select(t => new ButtonComponent {
                        Action = new MessageTemplateAction(t, t)
                    }).ToList <IFlexComponent>()
                }))
            });
        }
Exemple #20
0
        public static async Task <long> CopyFileToBlob(
            [ActivityTrigger] DurableActivityContext copyFileContext,
            Binder binder,
            TraceWriter log)
        {
            string filePath  = copyFileContext.GetInput <string>();
            long   byteCount = new FileInfo(filePath).Length;

            // strip the drive letter prefix and convert to forward slashes
            string blobPath = filePath
                              .Substring(Path.GetPathRoot(filePath).Length)
                              .Replace('\\', '/');
            string outputLocation = $"backups/{blobPath}";

            log.Info($"Copying '{filePath}' to '{outputLocation}'. Total bytes = {byteCount}.");

            // copy the file contents into a blob
            using (Stream source = File.Open(filePath, FileMode.Open))
                using (Stream destination = await binder.BindAsync <CloudBlobStream>(
                           new BlobAttribute(outputLocation)))
                {
                    await source.CopyToAsync(destination);
                }

            return(byteCount);
        }
Exemple #21
0
        public static Job CreateJob([ActivityTrigger] DurableActivityContext context)
        {
            ValueTuple <MediaWorkflowManifest, string, Asset> jobInput = context.GetInput <(MediaWorkflowManifest, string, Asset)>();
            MediaWorkflowManifest workflowManifest = jobInput.Item1;
            string inputFileUrl = jobInput.Item2;
            Asset  inputAsset   = jobInput.Item3;

            Job         job         = null;
            string      insightId   = null;
            MediaClient mediaClient = new MediaClient(workflowManifest);

            bool videoIndexer = workflowManifest.TransformPresets.Contains <MediaTransformPreset>(MediaTransformPreset.VideoIndexer);
            bool audioIndexer = workflowManifest.TransformPresets.Contains <MediaTransformPreset>(MediaTransformPreset.AudioIndexer);

            if (mediaClient.IndexerEnabled() && (videoIndexer || audioIndexer))
            {
                insightId = mediaClient.IndexerUploadVideo(inputFileUrl, inputAsset, workflowManifest.JobPriority, videoIndexer, audioIndexer);
            }

            Transform transform = mediaClient.GetTransform(workflowManifest.TransformPresets);

            if (transform != null)
            {
                MediaJobOutputInsight outputInsight = new MediaJobOutputInsight()
                {
                    Id           = insightId,
                    VideoIndexer = videoIndexer,
                    AudioIndexer = audioIndexer
                };
                job = mediaClient.CreateJob(transform.Name, workflowManifest.JobName, null, workflowManifest.JobPriority, inputFileUrl, inputAsset, workflowManifest.OutputAssetStorage, workflowManifest.JobOutputPublish, outputInsight, false);
            }
            return(job);
        }
        public static async Task <ProjectionResultsRecord <Get_League_Summary_Definition_Return> > RunLeagueSummaryInformationProjectionActivity(
            [ActivityTrigger] DurableActivityContext context,
            ILogger log)
        {
            #region Logging
            if (null != log)
            {
                log.LogInformation($"GetLeagueSummaryCreateQueryRequestActivity started - instance {context.InstanceId} ");
            }
            #endregion

            ProjectionRequest projectionRequest = context.GetInput <ProjectionRequest>();

            if (null != projectionRequest)
            {
                return(await ProcessLeagueSummaryInformationProjection(projectionRequest.ProjectionName,
                                                                       projectionRequest.AggregateInstanceUniqueIdentifier,
                                                                       log));
            }
            else
            {
                #region Logging
                if (null != log)
                {
                    log.LogInformation($"Unable to read projection request {context.InstanceId} ");
                }
                #endregion
            }

            return(null);
        }
Exemple #23
0
        public static long GetFileSize([ActivityTrigger] DurableActivityContext ctx)
        {
            string fileName = ctx.GetInput <string>();
            var    info     = new FileInfo(fileName);

            return(info.Length);
        }
Exemple #24
0
        public static int OrthogonalizeColumnsWorker(
            [ActivityTrigger] DurableActivityContext ctx)
        {
            // Do this little dance since Azure activity functions can only
            // take one argument

            /*
             * var q_j = args.q;
             * var M = args.data;
             * var idx = args.idx;
             * var cols = args.cols;
             * var i = args.i;
             *
             * //var q_j = M.Column(i);
             * var end_idx = idx + cols;
             *
             * for (int k = idx; k < end_idx; k++)
             * {
             *  var v_k = M.Column(k);
             *  M.SetColumn(k, v_k - ((q_j * v_k) * q_j));
             * }
             */

            var data = ctx.in

                       return(1);
        }
Exemple #25
0
        public static async Task Http01Precondition([ActivityTrigger] DurableActivityContext context, ILogger log)
        {
            var site = context.GetInput <Site>();

            var websiteClient = await CreateWebSiteManagementClientAsync();

            var config = await websiteClient.WebApps.GetConfigurationAsync(site);

            // 既に .well-known が仮想アプリケーションとして追加されているか確認
            var virtualApplication = config.VirtualApplications.FirstOrDefault(x => x.VirtualPath == "/.well-known");

            if (virtualApplication == null)
            {
                // .well-known を仮想アプリケーションとして追加
                config.VirtualApplications.Add(new VirtualApplication
                {
                    VirtualPath    = "/.well-known",
                    PhysicalPath   = "site\\.well-known",
                    PreloadEnabled = false
                });
            }
            else
            {
                // 追加済みの場合は物理パスを変更しているので対処
                virtualApplication.PhysicalPath = "site\\.well-known";
            }

            await websiteClient.WebApps.UpdateConfigurationAsync(site, config);
        }
        public static async Task <List <Supplier> > GetActiveSuppliers([ActivityTrigger] DurableActivityContext inputs, ILogger log)
        {
            log.LogInformation("GetActiveSuppliers");
            var carService = ServiceProvider.GetCarService();

            return(await carService.GetActiveSuppliers());
        }
Exemple #27
0
        public static async Task CheckIsReady([ActivityTrigger] DurableActivityContext context, ILogger log)
        {
            var orderDetails = context.GetInput <OrderDetails>();

            var acme = await CreateAcmeClientAsync();

            orderDetails = await acme.GetOrderDetailsAsync(orderDetails.OrderUrl, orderDetails);

            if (orderDetails.Payload.Status == "pending")
            {
                // pending の場合はリトライする
                throw new RetriableActivityException("ACME domain validation is pending.");
            }

            if (orderDetails.Payload.Status == "invalid")
            {
                // エラーログ用に Authorization を取得
                foreach (var authzUrl in orderDetails.Payload.Authorizations)
                {
                    var authorization = await acme.GetAuthorizationDetailsAsync(authzUrl);

                    var challenge = authorization.Challenges.FirstOrDefault(x => x.Error != null);

                    if (challenge != null)
                    {
                        log.LogError(JsonConvert.SerializeObject(challenge.Error));
                    }
                }

                // invalid の場合は最初から実行が必要なので失敗させる
                throw new InvalidOperationException("Invalid order status. Required retry at first.");
            }
        }
        public static async Task <List <CarPrice> > SearchCarSupplier([ActivityTrigger] DurableActivityContext inputs)
        {
            var r = inputs.GetInput <SupplierSearchRequest>();
            var carSearchService = new CarSearchService();

            return(await carSearchService.SearchCars(r.CarSearchRequest, r.Supplier));
        }
Exemple #29
0
        public static void Run([ActivityTrigger] DurableActivityContext context, ILogger log,
                               ExecutionContext executionContext)
        {
            // config and input
            _log = log;
            var input = new
            {
                ResourceGroupName = context.GetInput <Tuple <string, string> >().Item1,
                ResourcesName     = context.GetInput <Tuple <string, string> >().Item2
            };
            var    config         = executionContext.BuildConfiguration();
            var    clientId       = config["ApplicationId"];
            var    clientSecret   = config["ApplicationSecret"];
            var    tenantId       = config["TenantId"];
            string subscriptionId = config["SubscriptionId"];

            log.LogInformation($"delete activity group start {input.ResourcesName} ");

            try
            {
                // authenticate and delete resource group
                if (!AzureCredentials.Make(tenantId, clientId, clientSecret, subscriptionId)
                    .TryGetAzure(out IAzure azure, message => _log.LogError(message)))
                {
                    return;
                }
                azure.DeleteResourcesInGroup(input.ResourceGroupName, input.ResourcesName, s => _log.LogWarning(s));
            }
            catch (Exception e)
            {
                _log.LogError($"delete activity group {input.ResourceGroupName} {e.Message}", e);
            }
        }
        public static int Refund2([ActivityTrigger] DurableActivityContext context)
        {
            (int Amount, Guid Id)payload = context.GetInput <(int, Guid)>();
            Account[payload.Id]          = Account[payload.Id] + payload.Amount;

            return(Account[payload.Id]);
        }