Giter Club home page Giter Club logo

switchboard's Introduction

Switchboard

Build Status

Switchboard is a framework for processing email. It consists of a core that maintains a connection to an IMAP server and routes event notifications to a set of workers. The workers interact with the IMAP server through a simple API exposed by the Switchboard core.

Features

  • Totally open source — developers can extend Switchboard or use the API to create workers specific to their product.
  • Switchboard handles the boilerplate, leaving the logic to you — Switchboard frees you from the plumbing of server-side email monitoring and fetching, allowing you to focus on your products and services.
  • You deploy it — by running persistent processes on your own server, Switchboard can help you avoid mobile OS backgrounding restrictions and heavy battery consumption, freeing up the client and leaving you in control.

Documentation

To begin using Switchboard, refer to the website documentation. This will take you from installation, to setting up a Switchboard worker or client.

To get Switchboard up and running, take a look at the install page.

To see an example of how Switchboard can be used, see the Examples page with examples and walkthroughs on:

  • Sending email push notifications
  • Storing email image attachments to a Dropbox folder

To see documenation of the Switchboard core Erlang modules and functions, see the API Docs.

License

Switchboard may be redistributed according to the BSD 3-Clause License.

Copyright 2014, ThusFresh, Inc.

switchboard's People

Contributors

acammack-r7 avatar anoskov avatar bismark avatar jakewilkins avatar jtmoulia avatar krisalyssa avatar kunks001 avatar leostera avatar toddtomkinson avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

switchboard's Issues

Keeping Test Account Credentials

This is a continuation of #4, specifically addressing having credentials for test accounts within the repo. (there goes security through obscurity)

include/switchboard.hrl does include real credentials for a test account. I totally agree, it opens up the account for abuse. It is used for live tests, or tests run against the an actual IMAP server. Perhaps it would be cleaner to mock out IMAP, but I believe that would be throwing out the baby with the bathwater: testing against a IMAP server aligns our code with the real IMAP behavior, and notifies us when and how that behavior changes.

There is already a concept of LIVE_TESTS vs TESTS, where LIVE_TESTS are tests which are run against an external resource, like Gmail. I propose that we keep this separation, but remove the default test account. Instead, if the tester wants to run LIVE_TESTS he can provide a list of credentials, and the live tests will be run across ALL credentials. It will remove the credentials from the repo (I'll change the account pass), and it'll be very useful for testing features across multiple IMAP providers.

Docker

I was wondering has anybody Dockerized this - or still uses this?

Process existing e-mails

After discussing with @jtmoulia a function to process existing e-mails would be very useful. Currently Switchboard only allows to process new e-mails. A function to also process existing e-mails would complete Switchboard for being a full IMAP API.

Bad URL to Erlang for Ubuntu

When trying to launch/provision the Vagrant box via vagrant up or vagrant provision, I'm getting this error:

TASK [switchboard : download the erlang deb] ***********************************
fatal: [default]: FAILED! => {"changed": false, "dest": "/tmp/erlang.deb", "failed": true,
"msg": "Request failed", "response": "HTTP Error 404: Not Found", "state": "absent",
"status_code": 404,
"url": "http://packages.erlang-solutions.com/site/esl/esl-erlang/FLAVOUR_3_general/esl-erlang_17.1-1~ubuntu~trusty_amd64.deb"}

Note that it's not a timeout error. I went poking around on packages.erlang-solutions.com and discovered that the URL should be http://packages.erlang-solutions.com/site/esl/esl-erlang/FLAVOUR_1_general/esl-erlang_17.1-1~ubuntu~trusty_amd64.deb (note that it's FLAVOUR_1_general, not FLAVOUR_3_general).

rebar issues when compiling

Hey, sorry to spam your issue tracker with this.

I can't get this to compile. I'm 100% sure it has to do with my setup and not your code, but I can't find a solution anywhere.

When I try to compile, either with locally or using the ansible playbooks, I get:

{"init terminating in do_boot",{undef,[{rebar_utils,wordsize,[],[]},

From rebar when installing dependencies.

I would use a vagrant box but I'm trying to do this on linux and last time I tried to install virtualbox i started getting random kernel panics and I don't want to go back there.

I've tried with rebar 2.6.2 and 3.2.0. I posted on stack overflow (more backtrace posted there) and haven't gotten any answers.

Any pointers on what to try or where better to ask this question much appreciated.

Thanks!
❤️

Allow auth to contain both access and refresh tokens

From @Ostera on #43

Just a question, given that oftentimes there already is an access_token that can be used alongside a refresh_token, what was the train of thought behind not allowing an Auth datatype to have both an AccessToken to be used, and a RefreshToken to fallback to? Just a thought, so that you don't have to request another AccessToken when registering a new monitored IMAP connection.

Ruby Wrapper

There's a Ruby tutorial but it's pretty low level, having to set up the faye server and listen on callbacks is tedious.

Installation under Debian 9.3

I realize this repository is more or less dead, but in the interest of saving others the work:
The repository as provided has a number of issues when trying to get it to work under Debian 9.3:

  • the ansible playbook assumes sudo is present and to be used
  • (the playbook is using the sudo: keyword which has been superseded by become:)
  • setup gets the Ubuntu version of Erlang
  • setup gets an ancient version of Erlang, whose dependencies are too ancient to be satisfied by current repos
  • even with a fitting version of erlang, it is not getting those dependencies
  • after installation, it is trying to start the service without elevated privileges
  • it is not providing a .service file, so starting the service with systemd fails either way
  • the init script is broken in a number of ways

I fought through all of that, and all I got was

Feb 22 18:35:37 hostname systemd[1]: Starting LSB: Start Switchboard Erlang BEAM daemon...
Feb 22 18:35:37 hostname systemd[13951]: switchboard.service: Failed at step EXEC spawning /etc/init.d/switchboard: Exec format error
Feb 22 18:35:37 hostname systemd[1]: switchboard.service: Control process exited, code=exited status=203
Feb 22 18:35:37 hostname systemd[1]: Failed to start LSB: Start Switchboard Erlang BEAM daemon.
Feb 22 18:35:37 hostname systemd[1]: switchboard.service: Unit entered failed state.
Feb 22 18:35:37 hostname systemd[1]: switchboard.service: Failed with result 'exit-code'.

This is the diff of the changes I made to the playbook to get to that stage:
ansible.patch.txt
You would then use ansible-playbook -u $unprivileged_user --ask-pass --ask-become-pass -i provisioning/$your_hosts_file provisioning/playbook.yml

Dependencies I had to install were:

  • sshpass for ansible's --ask-pass
  • libwxbase3.0-0v5 for erlang
  • libwxgtk3.0-0v5 for erlang
  • libsctp1 for erlang

Do note that the files get installed under /home/$unprivileged_user/switchboard/_rel/switchboard/.

If you manually call /home/$unprivileged_user/switchboard/_rel/switchboard/bin/switchboard start, the process list seems to indicate it started.
However, Port 8080 just gives you a blank page.
/home/$unprivileged_user/switchboard/_rel/switchboard/log/ is empty.

This is as far as I've come. If anybody actually gets it to work, please do tell how.

Edit: I may have kinda-sorta gotten it to work.
To manually start it, you have to pass the HOME= environment variable to the executable, like this:

HOME=/home/$unprivileged_user /home/$unprivileged_user/switchboard/_rel/switchboard/bin/switchboard start

http://hostname:8080/jsclient at least shows the expected boilerplate JS instructions now.

Edit 2: Nope, still doesn't work. The API seems to work and it does seem to talk with the IMAP account, but whenever I try to actually do anything, it crashes.
I know for a fact that IMAP is working, because I can operate fine on the command line - login, fetch mails, etc.

Making project in Vagrant fails

I've tried everything I know of, but can't get this to work. Changing the order of the deps will just cause the first dep listed to fail (cowboy for instance).

➜  switchboard git:(master) ✗ vagrant provision
==> default: Running provisioner: ansible...
PYTHONUNBUFFERED=1 ANSIBLE_FORCE_COLOR=true ANSIBLE_HOST_KEY_CHECKING=false ANSIBLE_SSH_ARGS='-o UserKnownHostsFile=/dev/null -o ForwardAgent=yes -o ControlMaster=auto -o ControlPersist=60s' ansible-playbook --private-key=/Users/stephenbussey/src-untracked/switchboard/.vagrant/machines/default/virtualbox/private_key --user=vagrant --connection=ssh --limit='default' --inventory-file=/Users/stephenbussey/src-untracked/switchboard/.vagrant/provisioners/ansible/inventory --extra-vars={"switchboard_host":"192.168.50.2","switchboard_clone":false,"switchboard_profile":"dev","switchboard_google_client_id":null,"switchboard_google_client_secret":null} provisioning/playbook.yml

PLAY [switchboard] ************************************************************

GATHERING FACTS ***************************************************************
ok: [default]

TASK: [switchboard | ensure apt cache is up to date] **************************
ok: [default]

TASK: [switchboard | download the erlang deb] *********************************
ok: [default]

TASK: [switchboard | install the erlang deb] **********************************
ok: [default]

TASK: [switchboard | ensure apt cache is up to date] **************************
ok: [default]

TASK: [switchboard | ensure packages are installed] ***************************
ok: [default] => (item=make,git)

TASK: [switchboard | clone the switchboard repo] ******************************
skipping: [default]

TASK: [switchboard | template out the vars.config file] ***********************
ok: [default]

TASK: [switchboard | make deps] ***********************************************
failed: [default] => {"changed": true, "cmd": ["make", "PROFILE=dev", "deps"], "delta": "0:00:00.044495", "end": "2015-08-09 04:00:44.344233", "rc": 2, "start": "2015-08-09 04:00:44.299738", "warnings": []}
stderr: Unknown or invalid dependency: lager. Please consult the erlang.mk README for instructions.
make: *** [/home/vagrant/switchboard/deps/lager] Error 78

FATAL: all hosts have already failed -- aborting

PLAY RECAP ********************************************************************
           to retry, use: --limit @/Users/stephenbussey/playbook.retry

default                    : ok=7    changed=0    unreachable=0    failed=1

Ansible failed to complete successfully. Any error output should be
visible above. Please fix these errors and try again.

Remove links to Bitbucket

Links in the README point to Bitbucket.

Also the getting started point users to Bitbucket for downloading the source.

"message" event doesn't fire for some types of messages

When I test switchboard by sending a test email from Mandrill, the "message" event never fires for some reason.

It works for all other types of emails... except emails from Mandrill. Any ideas? Here's how I'm sending them via the mandrill-api gem:

  mandrill = Mandrill::API.new 'API_KEY_HERE'
  message = {"auto_text"=>nil,
   "text"=>params['body'],
   "to"=>
      [{"type"=>"to",
          "email"=>'TO_EMAIL_HERE',
          "name"=>""}],
   "from_name"=>"Foo",
   "from_email"=>"[email protected]",
   "subject"=>'TEST SUBJECT',
   "headers"=>{"Reply-To"=>"[email protected]"},
   "important"=>false}
  async = false
  result = mandrill.messages.send message, async

  puts "sent"

FAQ typo

"This separation of responsibilites across IMAP connections allows for simpler management of the IMAP connections, thought at the cost of using multiple IMAP connections."

Installation issues

supposed to or will? "That was supposed to download, unpack, and start the application, dumping you at the Erlang console"

fix link: "the client section of getting started"

fix link: "Next up: connecting a client."

Error while compiling source (vagrant ansible)

Hi,

I just got started with Switchboard and unfortunately I'm encountering some problems while trying to install. When I just run the installation instructions it gives a fatal error when it's running the task compile source.

TASK: [switchboard | template out the app.config file] ************************
ok: [default]

TASK: [switchboard | compile source] ******************************************
failed: [default] => {"changed": true, "cmd": ["make", "PROFILE=dev", "app"], "delta": "0:00:00.173620", "end": "2014-10-18 21:44:09.369231", "rc": 2, "start": "2014-10-18 21:44:09.195611"}
stderr: make: *** [ebin/switchboard.app] Error 1
stdout:  ERLC   imap.erl reloader.erl rfc2822.erl switchboard.erl switchboard_accounts.erl switchboard_accounts_sup.erl switchboard_app.erl switchboard_idler.erl switchboard_idlers.erl switchboard_jmap.erl switchboard_operator.erl switchboard_social_oauth.erl switchboard_sup.erl switchboard_util.erl switchboard_workers.erl imap_tests.erl switchboard_accounts_tests.erl switchboard_idler_tests.erl switchboard_operator_tests.erl
src/imap.erl: undefined parse transform 'lager_transform'

FATAL: all hosts have already failed -- aborting

Running commands on Switchboard server

I'm trying to play around with the server which I have up and running, and can't figure out how to run any commands seen here: http://switchboard.spatch.co/interfaces/

I've tried creating POST requests to: http://192.168.50.2:8080/client with this raw json:
[["connect", {"host": "imap.gmail.com",
"port": 993,
"auth": {
"type": "plain",
"username": "[email protected]",
"password": "secret"}}]]

What's the easiest way to run commands?
and keep getting a 404. I'm not really sure how to incorporate SSL or if that's necessary.

Add Vagrantfile

Let's add a Vagrantfile with Ansible playbooks for getting the server up and running in a VM.

Benchmark

After discussing with @jtmoulia a public benchmark would be a great addition. This would help people to get a (rough) indication of the resources required to keep up with (x) accounts.

Examples issues

Let's be consistent about styling commands and responses, some are code blocks, some are inline (I think blocks are best).

accidentally a word: "Switchboard allows to develop a wide variety of clients."
accidentally a word: "start the Switchboard application and point your browser"

plural or singular? "users’ emails to his or her dropbox."

fix link, drop quotes: "see ‘Switchboard Installation’ for details"

you or we or I, needs consistency: "After your switchboard server is up, we are ready to start building our Ruby client so we can communicate with our switchboard server. To get started, I created the following Gemfile:"

drop quotes: 'faye project’, ‘ruby SDK’, ‘faye-websocket documentation’

missing punctuation: "To upload files to Dropbox we’ll use Dropbox’s very own ‘ruby SDK’"

"funky stuff" ?

whitespace: "ruby your-file-name.rb(we"

make in to a code block: "we’ll see: [:open]"

example shows plain auth: "In this example we’re using Switchboard’s Gmail oauth to keep things simple:"

markup output: "we should see the message [:message, [[“connected”, {}]]]."

this has changed to watchMailboxes right? "That’s easily done with the idle command"

doesn't match the response format: "we need to use the message ID"

drop markup on gem: "use the handy mail gem", "adding and bundling the gem"

it's not 1998, drop the hyphen: "If an e-mail has no attachments"

capitalize Dropbox throughout

capitalize OAuth throughout

fix link: "https://www.dropbox.com/developers/apps"

bin/switchboard foreground crashes

$ bin/switchboard foreground 
Exec: /Users/g/Sites/switchboard/erts-5.10.4/bin/erlexec -noinput +Bd -boot /Users/g/Sites/switchboard/releases/0.1.0/switchboard -mode embedded -config /Users/g/Sites/switchboard/releases/0.1.0/sys.config -args_file /Users/g/Sites/switchboard/releases/0.1.0/vm.args -- foreground
Root: /Users/g/Sites/switchboard

=INFO REPORT==== 11-Jun-2014::16:39:44 ===
    application: cowboy
    exited: {bad_return,
                {{cowboy_app,start,[normal,[]]},
                 {'EXIT',
                     {undef,
                         [{cowboy_app,start,[normal,[]],[]},
                          {application_master,start_it_old,4,
                              [{file,"application_master.erl"},
                               {line,269}]}]}}}}
    type: permanent
{"Kernel pid terminated",application_controller,"{application_start_failure,cowboy,{bad_return,{{cowboy_app,start,[normal,[]]},{'EXIT',{undef,[{cowboy_app,start,[normal,[]],[]},{application_master,start_it_old,4,[{file,\"application_master.erl\"},{line,269}]}]}}}}}"}

Crash dump was written to: erl_crash.dump
Kernel pid terminated (application_controller) ({application_start_failure,cowboy,{bad_return,{{cowboy_app,start,[normal,[]]},{'EXIT',{undef,[{cowboy_app,start,[normal,[]],[]},{application_master,st

crashlog https://gist.github.com/gmaliar/e49a8fdc77127b69874c

get_mailboxes bug

SwitchBoard returns Following exception:

([email protected])43> switchboard_jmap:get_mailboxes(<<"[email protected]">>).
{error,{{badmatch,{error,{{'BAD',[<<"Could">>,<<"not">>,
<<"parse">>,<<"command">>]},
[]}}},
[{switchboard_jmap,get_mailboxes,2,
[{file,"src/switchboard_jmap.erl"},{line,186}]},
{switchboard,with_imap,2,
[{file,"src/switchboard.erl"},{line,216}]},
{erl_eval,do_apply,6,[{file,"erl_eval.erl"},{line,661}]},
{shell,exprs,7,[{file,"shell.erl"},{line,676}]},
{shell,eval_exprs,7,[{file,"shell.erl"},{line,631}]},
{shell,eval_loop,3,[{file,"shell.erl"},{line,616}]}]}}

Code not handling timeout for get_messages

Reported by @vu0tran in #55

Thanks. There were also some other crashes. They look a bit different. Not sure if they're related?

2016-01-21 21:30:50 =ERROR REPORT====
Ranch listener switchboard_cowboy had connection process started with cowboy_protocol:start_link/4 at <0.246.0> exit with reason: {[{reason,{badmatch,{<<"error">>,[{<<"type">>,{{badmatch,{error,timeout}},[{switchboard_jmap,'-get_messages/3-fun-1-',5,[{file,"src/switchboard_jmap.erl"},{line,510}]},{switchboard_jmap,get_messages,3,[{file,"src/switchboard_jmap.erl"},{line,507}]},{switchboard,with_imap,2,[{file,"src/switchboard.erl"},{line,216}]},{switchboard_jmap,call,2,[{file,"src/switchboard_jmap.erl"},{line,388}]},{switchboard_workers,call_all,3,[{file,"src/switchboard_workers.erl"},{line,165}]},{switchboard_workers,websocket_handle,3,[{file,"src/switchboard_workers.erl"},{line,99}]},{cowboy_websocket,handler_call,7,[{file,"src/cowboy_websocket.erl"},{line,588}]},{cowboy_protocol,execute,4,[{file,"src/cowboy_protocol.erl"},{line,442}]}]}},{<<"method">>,<<"getMessages">>},{<<"arguments">>,[{<<"ids">>,[<<"INBOX!3?131964">>]},{<<"properties">>,[<<"raw">>,<<"uid">>]}]}],undefined}}},{mfa,{switchboard_workers,websocket_handle,3}},{stacktrace,[{switchboard_workers,call_all,3,[{file,"src/switchboard_workers.erl"},{line,164}]},{switchboard_workers,websocket_handle,3,[{file,"src/switchboard_workers.erl"},{line,99}]},{cowboy_websocket,handler_call,7,[{file,"src/cowboy_websocket.erl"},{line,588}]},{cowboy_protocol,execute,4,[{file,"src/cowboy_protocol.erl"},{line,442}]}]},{msg,{text,<<"[[\"getMessages\",{\"account\":\"[email protected]\",\"ids\":[\"INBOX!3?131964\"],\"properties\":[\"raw\",\"uid\"]}]]">>}},{req,[{socket,#Port<0.3023>},{transport,ranch_tcp},{connection,keepalive},{pid,<0.246.0>},{method,<<"GET">>},{version,'HTTP/1.1'},{peer,{{192,168,50,2},55091}},{host,<<"192.168.50.2">>},{host_info,undefined},{port,8080},{path,<<"/workers">>},{path_info,undefined},{qs,<<>>},{qs_vals,undefined},{bindings,[]},{headers,[{<<"host">>,<<"192.168.50.2:8080">>},{<<"upgrade">>,<<"websocket">>},{<<"connection">>,<<"Upgrade">>},{<<"sec-websocket-key">>,<<"oadcr65AkM3nzrZeUSvEbg==">>},{<<"sec-websocket-version">>,<<"13">>}]},{p_headers,[{<<"upgrade">>,[<<"websocket">>]},{<<"connection">>,[<<"upgrade">>]}]},{cookies,undefined},{meta,[{websocket_version,13},{websocket_compress,false}]},{body_state,waiting},{buffer,<<>>},{multipart,undefined},{resp_compress,false},{resp_state,done},{resp_headers,[]},{resp_body,<<>>},{onresponse,undefined}]},{state,{state}}],[{cowboy_protocol,execute,4,[{file,"src/cowboy_protocol.erl"},{line,442}]}]}
2016-01-21 21:31:05 =SUPERVISOR REPORT====
     Supervisor: {<0.227.0>,switchboard_accounts}
     Context:    child_terminated
     Reason:     normal
     Offender:   [{pid,<0.228.0>},{name,active},{mfargs,{imap,start_link,[{ssl,<<"imap.gmail.com">>,993},[{cmds,[{cmd,{call,{login,{xoauth2,<<"[email protected]">>,{<<"1/ZY5I9wJ18_gv-_qTf8fDaa0XW6RZBbeLD04Otmz0qro">>,<<"google">>}}}}}]},{post_init_callback,#Fun<switchboard.0.122082165>}]]}},{restart_type,permanent},{shutdown,5000},{child_type,worker}]

Client Interface issues

"password": "drowssap"
"token": "1/kif0yuTDHWu7UKtTCNtgDWTeoj_IYZM-SPmyxNiDCjc"

Are these working credentials? I'm not sure if we want to leave that exposed to the world since someone could just start spamming the world with out test account?

fix link: "Next up: [Switchboard]"

Immediate "close" after "getMessages" on some accounts

For some email accounts, I've been running into something bizarre. When you send a "getMessages" command after listening to "newMessage" event, the websocket decides to close itself with a 1011 error.

When I do the "getMessages" command without the hook to "newMessage", it seems to be fine.

Any tips on how I can debug this or where to look?

[:send, "getMessages", {:account=>"[email protected]", :ids=>["INBOX!596995877?42082"], :properties=>["raw", "uid"]}]

[:close, #<Faye::WebSocket::API::CloseEvent:0x00000001e0fc08 @type="close", @code=1011, @reason="", @bubbles=false, @cancelable=false, @current_target=#<Faye::WebSocket::Client:0x00000002b765b8 @url="ws://192.168.50.2:8080/workers", @ready_state=3, @listeners={"open"=>[#<Proc:[email protected]:15>], "message"=>[#<Proc:[email protected]:74>], "error"=>[#<Proc:[email protected]:123>], "close"=>[#<Proc:[email protected]:127>]}, @driver=#<WebSocket::Driver::Client:0x00000002b9a670 @listeners={"open"=>[#<Proc:0x000000017b6cd0@/var/lib/gems/1.9.1/gems/faye-websocket-0.10.2/lib/faye/websocket/api.rb:39>], "message"=>[#<Proc:0x000000017b6a00@/var/lib/gems/1.9.1/gems/faye-websocket-0.10.2/lib/faye/websocket/api.rb:40>], "close"=>[#<Proc:0x000000017b6848@/var/lib/gems/1.9.1/gems/faye-websocket-0.10.2/lib/faye/websocket/api.rb:41>], "error"=>[#<Proc:0x000000017b63c0@/var/lib/gems/1.9.1/gems/faye-websocket-0.10.2/lib/faye/websocket/api.rb:43>]}, @socket=#<Faye::WebSocket::Client:0x00000002b765b8 ...>, @reader=#<WebSocket::Driver::StreamReader:0x00000002b9e1a8 @buffer="\x88\x02\x03\xF3", @offset=4>, @options={:max_length=>nil, :protocols=>nil, :masking=>true}, @max_length=67108863, @headers={"connection"=>"Upgrade", "upgrade"=>"websocket", "sec-websocket-accept"=>"k6NDeMpRpaiq6OBFYTNpUoMbZKY="}, @queue=[], @ready_state=3, @extensions=#<WebSocket::Extensions:0x00000002b847d0 @rsv3=nil, @rsv2=nil, @rsv1=nil, @by_name={}, @in_order=[], @sessions=[], @index={}>, @stage=5, @masking=true, @protocols=[], @require_masking=nil, @ping_callbacks={}, @key="SNjaCjvYHirOeH07bzSPuQ==", @accept="k6NDeMpRpaiq6OBFYTNpUoMbZKY=", @http=#<WebSocket::HTTP::Response:0x000000017afbd8 @buffer=[], @headers={"connection"=>"Upgrade", "upgrade"=>"websocket", "sec-websocket-accept"=>"k6NDeMpRpaiq6OBFYTNpUoMbZKY="}, @stage=2, @code=101>, @pathname="/workers", @status=101, @frame=nil, @message=nil>, @ping=nil, @ping_id=0, @buffered_amount=0, @secure=false, @origin_tls={}, @socket_tls={}, @stream=#<Faye::WebSocket::Client::Connection::EM_CONNECTION_CLASS:0x000000017bbd98 @signature=2, @parent=#<Faye::WebSocket::Client:0x00000002b765b8 ...>>, @close_params=["", 1011]>, @target=#<Faye::WebSocket::Client:0x00000002b765b8 @url="ws://192.168.50.2:8080/workers", @ready_state=3, @listeners={"open"=>[#<Proc:[email protected]:15>], "message"=>[#<Proc:[email protected]:74>], "error"=>[#<Proc:[email protected]:123>], "close"=>[#<Proc:[email protected]:127>]}, @driver=#<WebSocket::Driver::Client:0x00000002b9a670 @listeners={"open"=>[#<Proc:0x000000017b6cd0@/var/lib/gems/1.9.1/gems/faye-websocket-0.10.2/lib/faye/websocket/api.rb:39>], "message"=>[#<Proc:0x000000017b6a00@/var/lib/gems/1.9.1/gems/faye-websocket-0.10.2/lib/faye/websocket/api.rb:40>], "close"=>[#<Proc:0x000000017b6848@/var/lib/gems/1.9.1/gems/faye-websocket-0.10.2/lib/faye/websocket/api.rb:41>], "error"=>[#<Proc:0x000000017b63c0@/var/lib/gems/1.9.1/gems/faye-websocket-0.10.2/lib/faye/websocket/api.rb:43>]}, @socket=#<Faye::WebSocket::Client:0x00000002b765b8 ...>, @reader=#<WebSocket::Driver::StreamReader:0x00000002b9e1a8 @buffer="\x88\x02\x03\xF3", @offset=4>, @options={:max_length=>nil, :protocols=>nil, :masking=>true}, @max_length=67108863, @headers={"connection"=>"Upgrade", "upgrade"=>"websocket", "sec-websocket-accept"=>"k6NDeMpRpaiq6OBFYTNpUoMbZKY="}, @queue=[], @ready_state=3, @extensions=#<WebSocket::Extensions:0x00000002b847d0 @rsv3=nil, @rsv2=nil, @rsv1=nil, @by_name={}, @in_order=[], @sessions=[], @index={}>, @stage=5, @masking=true, @protocols=[], @require_masking=nil, @ping_callbacks={}, @key="SNjaCjvYHirOeH07bzSPuQ==", @accept="k6NDeMpRpaiq6OBFYTNpUoMbZKY=", @http=#<WebSocket::HTTP::Response:0x000000017afbd8 @buffer=[], @headers={"connection"=>"Upgrade", "upgrade"=>"websocket", "sec-websocket-accept"=>"k6NDeMpRpaiq6OBFYTNpUoMbZKY="}, @stage=2, @code=101>, @pathname="/workers", @status=101, @frame=nil, @message=nil>, @ping=nil, @ping_id=0, @buffered_amount=0, @secure=false, @origin_tls={}, @socket_tls={}, @stream=#<Faye::WebSocket::Client::Connection::EM_CONNECTION_CLASS:0x000000017bbd98 @signature=2, @parent=#<Faye::WebSocket::Client:0x00000002b765b8 ...>>, @close_params=["", 1011]>, @event_phase=2>]

Typing in service vagrant shows unrecognized service

I run these two commands:
vagrant@vagrant-ubuntu-trusty-64:$ ls
switchboard
vagrant@vagrant-ubuntu-trusty-64:
$ service vagrant
vagrant: unrecognized service

I am not sure why I am being returned: vagrant: unrecognized service. Any ideas?

If you cd into switchboard, the files appear to be there:
vagrant@vagrant-ubuntu-trusty-64:$ cd switchboard
vagrant@vagrant-ubuntu-trusty-64:
/switchboard$ ls
CONTRIBUTING.md CONTRIBUTORS doc erlang.mk etc include INSTALL.md LICENSE Makefile priv provisioning readme.md relx.config site src Vagrantfile

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.