Responda ao processo filho interativo gerado

0

Há um comando do Amazon Web Services chamado eb init que permite iniciar o diretório de trabalho atual como um aplicativo elástico de base.

Este comando é interativo, o que significa que eb init responderá com uma lista de opções.

$ eb init

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
(default is 3):

Esta acima é a opção region , a segunda é a opção app e a terceira é uma lista das possíveis opções environment (ou env ).

O que eu estou procurando é envolver o comando eb init e ser capaz de passar seqüências de caracteres que podem ignorar a interatividade do script.

ebInit --region=eu-central-1 --app=my-app --env=my-app-live

Eu precisaria analisar o stdout aqui e dividir as linhas e obter o número correspondente à opção passada no argumento, o que é bastante fácil, porque as opções podem mudar números.

Como uma prova de conceito, eu ficaria bem com algo assim.

ebInit --region=5 --app=1 --env=1

Acho difícil acreditar que esses tipos de comandos interativos sejam caixas-pretas e não possam ser programaticamente interatuados. Eu tentei fazer isso com node.js e não pude fazê-lo responder, aqui está o meu post antigo stackoverflow " Respondendo a um comando interativo via processo filho ", que não recebeu atenção.

Estou postando isso aqui no unix / linux para perguntar se isso é possível e, em caso afirmativo, como e em qual idioma?

    
por ThomasReggi 22.11.2016 / 21:57

1 resposta

0

Com expect , uma solução pode ser executada nas linhas de

#!/usr/bin/env expect

# or instead figure out a TCL getopt library
if {[llength $argv] != 3} {
    puts stderr "Usage: $argv0 region app env"
    exit 64
}
set aws_region [lindex $argv 0]
set aws_app    [lindex $argv 1]
set aws_env    [lindex $argv 2]

spawn -noecho eb init

set get_regions 1
while {$get_regions} {
    expect {
        # look for the "1) us-east-1 : US East (N. Virginia)"
        # assign to what TCL calls an array
        -re {([0-9]+). ([a-z0-9-]+) :} {
            set region_to_num($expect_out(2,string)) $expect_out(1,string)
        }
        # how we break out of the loop, also array entry
        # for "default" region if need be
        -re {\(default is ([0-9]+)\)} {
            set region_to_num(default) $expect_out(1,string)
            set get_regions 0
        }
    }
}

# show what we got based on arguments and parse of eb output
puts "region=$aws_region region_num=$region_to_num($aws_region) env=$aws_env"

ou eu acho que você poderia encontrar ou escrever uma biblioteca expect -like em JavaScript, mas isso poderia ser mais trabalho. O que quer que agrada sua fantasia ...

    
por 23.11.2016 / 00:32