Aduril
Scripting with User Switch Command
Hello there,
to improve the workflow of my team I want to make it easier for them to connect to a remote system (aka our stage environment and our production environment).
Currently the workflow looks as following
./start-iex me 127.0.0.1 #script that set cookies and stuff
iex(me@127.0.0.1)1> Node.connect :"app@IP.OF.STAGE.ENV"
true
iex(me@127.0.0.1)3> #CTRL+G
User switch command
--> r 'app@IP.OF.STAGE.ENV'
--> c 2
Eshell V10.5 (abort with ^G)
(app@IP.OF.STAGE.ENV)1> #CTRL+G again
User switch command
--> r 'app@IP.OF.STAGE.ENV' 'Elixir.IEx'
--> c 3
iex(app@IP.OF.STAGE.ENV)1> #iex shell on remote system
As you can see this is rather tedious and error prone (how often I used the wrong quotes here…).
So my question is:
Does anybody know a way to enter the User Switch Command in a way that is scriptable. My overall goal would be a script that allows people to simply connect to one of our deployed stages.
Any ideas?
Marked As Solved
Nicd
I have used Expect for this, as it is designed for automating usage of interactive programs.
I no longer use the script but here it is for reference: refresh.exp · master · Mikko Ahlroth / mebe · GitLab – it should help you get started in case you go with Expect.
Note that on line 14, send " " sends the ctrl+g IIRC. It may not be copied correctly if you copy it with a browser so you may want to download the file directly. (And indeed if I copy it to this forum, it’s rendered as send "a"!)
EDIT: Note that there is also a --remsh option for IEx. Maybe that already does what you need, at least partly?
Also Liked
Aduril
Thanks @Nicd,
I have implemented it as expect-script now and will try to improve it. For others with a similar problem, here is my current solution that seems to do the trick:
set username [lindex $argv 0]
set app_ip [lindex $argv 1]
spawn ./start-iex $username
expect "iex" { send "Node.connect :\"app@$app_ip\"" }
expect "iex" { send "^G" } # this might break while copy-pasting - it is the CTRL+G command
expect -- " -->" { send "r 'app@$app_ip' \n" }
expect -- " -->" { send "c 2\n" }
expect "(app@*" { send "^G" } # see above
expect -- " -->" { send "r 'app@$app_ip' 'Elixir.IEx'\n" }
expect -- " -->" { send "c 3\n" }
interact
I have not used expect before, so if you see any unnecessary parts let me know
.
And if anybody knows a way to enter the user switch command mode within an elixir script, let me know.
Last Post!
BlindingDark
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









