2013-05-04 02:55:08 -04:00
|
|
|
package rpc
|
|
|
|
|
|
|
|
import (
|
2013-12-10 16:26:07 -05:00
|
|
|
"io"
|
|
|
|
"log"
|
2019-03-26 10:21:07 -04:00
|
|
|
"net/rpc"
|
2015-08-05 22:41:29 -04:00
|
|
|
|
2017-04-04 16:39:01 -04:00
|
|
|
"github.com/hashicorp/packer/packer"
|
2019-03-26 10:21:07 -04:00
|
|
|
"github.com/ugorji/go/codec"
|
2013-05-04 02:55:08 -04:00
|
|
|
)
|
|
|
|
|
2013-12-10 16:26:07 -05:00
|
|
|
const (
|
|
|
|
DefaultArtifactEndpoint string = "Artifact"
|
2013-12-11 14:19:36 -05:00
|
|
|
DefaultBuildEndpoint = "Build"
|
2013-12-10 16:26:07 -05:00
|
|
|
DefaultBuilderEndpoint = "Builder"
|
|
|
|
DefaultCacheEndpoint = "Cache"
|
|
|
|
DefaultCommandEndpoint = "Command"
|
|
|
|
DefaultCommunicatorEndpoint = "Communicator"
|
|
|
|
DefaultHookEndpoint = "Hook"
|
|
|
|
DefaultPostProcessorEndpoint = "PostProcessor"
|
|
|
|
DefaultProvisionerEndpoint = "Provisioner"
|
|
|
|
DefaultUiEndpoint = "Ui"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Server represents an RPC server for Packer. This must be paired on
|
|
|
|
// the other side with a Client.
|
|
|
|
type Server struct {
|
2014-09-02 17:23:06 -04:00
|
|
|
mux *muxBroker
|
2013-12-10 16:26:07 -05:00
|
|
|
streamId uint32
|
|
|
|
server *rpc.Server
|
2013-12-11 19:31:59 -05:00
|
|
|
closeMux bool
|
2013-05-22 01:10:21 -04:00
|
|
|
}
|
|
|
|
|
2013-12-10 16:26:07 -05:00
|
|
|
// NewServer returns a new Packer RPC server.
|
2019-03-27 07:29:09 -04:00
|
|
|
func NewServer(conn io.ReadWriteCloser) (*Server, error) {
|
|
|
|
mux, err := newMuxBrokerServer(conn)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2014-09-02 17:23:06 -04:00
|
|
|
result := newServerWithMux(mux, 0)
|
2013-12-11 19:31:59 -05:00
|
|
|
result.closeMux = true
|
2014-09-02 17:23:06 -04:00
|
|
|
go mux.Run()
|
2019-03-27 07:29:09 -04:00
|
|
|
return result, nil
|
2013-05-04 02:55:08 -04:00
|
|
|
}
|
|
|
|
|
2014-09-02 17:23:06 -04:00
|
|
|
func newServerWithMux(mux *muxBroker, streamId uint32) *Server {
|
2013-12-10 16:26:07 -05:00
|
|
|
return &Server{
|
|
|
|
mux: mux,
|
|
|
|
streamId: streamId,
|
|
|
|
server: rpc.NewServer(),
|
2013-12-11 19:31:59 -05:00
|
|
|
closeMux: false,
|
2013-12-10 16:26:07 -05:00
|
|
|
}
|
2013-05-04 16:47:11 -04:00
|
|
|
}
|
|
|
|
|
2013-12-10 16:26:07 -05:00
|
|
|
func (s *Server) Close() error {
|
2013-12-11 19:31:59 -05:00
|
|
|
if s.closeMux {
|
|
|
|
log.Printf("[WARN] Shutting down mux conn in Server")
|
|
|
|
return s.mux.Close()
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
2013-06-09 22:25:48 -04:00
|
|
|
}
|
|
|
|
|
2019-03-27 10:04:03 -04:00
|
|
|
func (s *Server) RegisterArtifact(a packer.Artifact) error {
|
|
|
|
return s.server.RegisterName(DefaultArtifactEndpoint, &ArtifactServer{
|
2013-12-10 16:26:07 -05:00
|
|
|
artifact: a,
|
|
|
|
})
|
2013-05-04 18:33:36 -04:00
|
|
|
}
|
|
|
|
|
2019-03-27 10:04:03 -04:00
|
|
|
func (s *Server) RegisterBuild(b packer.Build) error {
|
|
|
|
return s.server.RegisterName(DefaultBuildEndpoint, &BuildServer{
|
2013-12-10 16:26:07 -05:00
|
|
|
build: b,
|
|
|
|
mux: s.mux,
|
|
|
|
})
|
2013-05-12 17:47:55 -04:00
|
|
|
}
|
|
|
|
|
2019-03-27 10:04:03 -04:00
|
|
|
func (s *Server) RegisterBuilder(b packer.Builder) error {
|
|
|
|
return s.server.RegisterName(DefaultBuilderEndpoint, &BuilderServer{
|
2019-12-17 05:25:56 -05:00
|
|
|
commonServer: commonServer{
|
|
|
|
selfConfigurable: b,
|
|
|
|
mux: s.mux,
|
|
|
|
},
|
2013-12-10 16:26:07 -05:00
|
|
|
builder: b,
|
|
|
|
})
|
2013-05-04 18:33:36 -04:00
|
|
|
}
|
|
|
|
|
2019-03-27 10:04:03 -04:00
|
|
|
func (s *Server) RegisterCommunicator(c packer.Communicator) error {
|
|
|
|
return s.server.RegisterName(DefaultCommunicatorEndpoint, &CommunicatorServer{
|
2019-12-17 05:25:56 -05:00
|
|
|
c: c,
|
|
|
|
commonServer: commonServer{
|
|
|
|
mux: s.mux,
|
|
|
|
},
|
2013-12-10 16:26:07 -05:00
|
|
|
})
|
2013-05-22 18:35:52 -04:00
|
|
|
}
|
|
|
|
|
2019-03-27 10:04:03 -04:00
|
|
|
func (s *Server) RegisterHook(h packer.Hook) error {
|
|
|
|
return s.server.RegisterName(DefaultHookEndpoint, &HookServer{
|
2013-12-10 16:26:07 -05:00
|
|
|
hook: h,
|
|
|
|
mux: s.mux,
|
|
|
|
})
|
|
|
|
}
|
2013-05-04 02:55:08 -04:00
|
|
|
|
2019-03-27 10:04:03 -04:00
|
|
|
func (s *Server) RegisterPostProcessor(p packer.PostProcessor) error {
|
|
|
|
return s.server.RegisterName(DefaultPostProcessorEndpoint, &PostProcessorServer{
|
2019-12-17 05:25:56 -05:00
|
|
|
commonServer: commonServer{
|
|
|
|
selfConfigurable: p,
|
|
|
|
mux: s.mux,
|
|
|
|
},
|
|
|
|
p: p,
|
2013-12-10 16:26:07 -05:00
|
|
|
})
|
|
|
|
}
|
2013-05-04 02:55:08 -04:00
|
|
|
|
2019-03-27 10:04:03 -04:00
|
|
|
func (s *Server) RegisterProvisioner(p packer.Provisioner) error {
|
|
|
|
return s.server.RegisterName(DefaultProvisionerEndpoint, &ProvisionerServer{
|
2019-12-17 05:25:56 -05:00
|
|
|
commonServer: commonServer{
|
|
|
|
selfConfigurable: p,
|
|
|
|
mux: s.mux,
|
|
|
|
},
|
|
|
|
p: p,
|
2013-12-10 16:26:07 -05:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2019-03-27 10:04:03 -04:00
|
|
|
func (s *Server) RegisterUi(ui packer.Ui) error {
|
|
|
|
return s.server.RegisterName(DefaultUiEndpoint, &UiServer{
|
2018-09-04 11:57:21 -04:00
|
|
|
ui: ui,
|
|
|
|
register: s.server.RegisterName,
|
2013-12-10 16:26:07 -05:00
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
// ServeConn serves a single connection over the RPC server. It is up
|
|
|
|
// to the caller to obtain a proper io.ReadWriteCloser.
|
|
|
|
func (s *Server) Serve() {
|
|
|
|
// Accept a connection on stream ID 0, which is always used for
|
|
|
|
// normal client to server connections.
|
|
|
|
stream, err := s.mux.Accept(s.streamId)
|
|
|
|
if err != nil {
|
|
|
|
log.Printf("[ERR] Error retrieving stream for serving: %s", err)
|
|
|
|
return
|
|
|
|
}
|
2014-09-02 17:23:06 -04:00
|
|
|
defer stream.Close()
|
2013-12-10 16:26:07 -05:00
|
|
|
|
2019-03-26 10:21:07 -04:00
|
|
|
h := &codec.MsgpackHandle{
|
|
|
|
RawToString: true,
|
|
|
|
WriteExt: true,
|
|
|
|
}
|
|
|
|
rpcCodec := codec.GoRpc.ServerCodec(stream, h)
|
2014-04-26 16:31:22 -04:00
|
|
|
s.server.ServeCodec(rpcCodec)
|
2013-12-10 16:26:07 -05:00
|
|
|
}
|