"net"
"strconv"
"time"
+
+ "golang.org/x/crypto/ssh"
)
// ReqState denotes state of the Request.
// PutInMaintenance prepares MuxPi for administrative action.
// It blinks LEDs, prints msg on the OLED display, etc.
PutInMaintenance(msg string) (err error)
- // Prepare creates appropriate user, generates RSA key, installs public key
+ // Prepare creates appropriate user, generates SSH keypair, installs public key
// so that it can be used for SSH authentication and returns private key.
// It removes current instance of the user, etc.
- Prepare(key *rsa.PublicKey) (err error)
+ Prepare(key *ssh.PublicKey) (err error)
// Healthcheck tests Dryad for system state, STM functions and state on MuxPi.
// It may cause Dryad to call SetFail of Worker interface if the problem detected is critical.
Healthcheck() (err error)
package dryad
import (
+ "errors"
"os"
"path"
"strconv"
)
// installPublicKey marshals and stores key in a proper location to be read by ssh daemon.
-func installPublicKey(key ssh.PublicKey, homedir, uid, gid string) error {
+func installPublicKey(key *ssh.PublicKey, homedir, uid, gid string) error {
+ if key == nil {
+ return errors.New("empty public key")
+ }
sshDir := path.Join(homedir, ".ssh")
err := os.MkdirAll(sshDir, 0755)
if err != nil {
if err != nil {
return err
}
- _, err = f.Write(ssh.MarshalAuthorizedKey(key))
+ _, err = f.Write(ssh.MarshalAuthorizedKey(*key))
return err
}
import (
"context"
- "crypto/rsa"
"fmt"
. "git.tizen.org/tools/boruta"
}
// Prepare is part of implementation of Dryad interface. Call to Prepare stops LED blinking.
-func (r *Rusalka) Prepare(key *rsa.PublicKey) (err error) {
+func (r *Rusalka) Prepare(key *ssh.PublicKey) (err error) {
// Stop maintenance.
if r.cancelMaintenance != nil {
r.cancelMaintenance()
if err != nil {
return fmt.Errorf("user information update failed: %s", err)
}
- // Prepare SSH access (it can't fail as key is of type rsa.PublicKey).
- sshPubKey, _ := ssh.NewPublicKey(key)
- // TODO: use ssh.PublicKey instead.
- return r.dryadUser.generateAndInstallKey(sshPubKey)
+ return r.dryadUser.installKey(key)
}
// Healthcheck is part of implementation of Dryad interface.
"crypto/rsa"
"crypto/x509"
"encoding/pem"
+ "errors"
"os"
"os/user"
"time"
gomock "github.com/golang/mock/gomock"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
+ "golang.org/x/crypto/ssh"
)
var _ = Describe("Rusalka", func() {
Skip("must be run as root")
}
+ err = d.Prepare(nil)
+ Expect(err).To(Equal(errors.New("empty public key")))
key, err := rsa.GenerateKey(rand.Reader, 1024)
Expect(err).ToNot(HaveOccurred())
- err = d.Prepare(&key.PublicKey)
+ pubKey, err := ssh.NewPublicKey(&key.PublicKey)
+ Expect(err).ToNot(HaveOccurred())
+ err = d.Prepare(&pubKey)
Expect(err).ToNot(HaveOccurred())
Expect(sshDir).To(BeADirectory())
Expect(authorizedKeysFile).To(BeARegularFile())
return
}
-// generateAndInstallKey calls generateAndInstallKey with parameters retrieved from the user field
+// installKey calls installPublicKey with parameters retrieved from the user field
// of borutaUser structure. This filed must be set before call to this function by update() method.
-func (bu *borutaUser) generateAndInstallKey(key ssh.PublicKey) error {
+func (bu *borutaUser) installKey(key *ssh.PublicKey) error {
return installPublicKey(key, bu.user.HomeDir, bu.user.Uid, bu.user.Gid)
}
}
// Register mocks base method
-func (m *MockSuperviser) Register(arg0 boruta.Capabilities) error {
- ret := m.ctrl.Call(m, "Register", arg0)
+func (m *MockSuperviser) Register(arg0 boruta.Capabilities, arg1, arg2 string) error {
+ ret := m.ctrl.Call(m, "Register", arg0, arg1, arg2)
ret0, _ := ret[0].(error)
return ret0
}
// Register indicates an expected call of Register
-func (mr *MockSuperviserMockRecorder) Register(arg0 interface{}) *gomock.Call {
- return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Register", reflect.TypeOf((*MockSuperviser)(nil).Register), arg0)
+func (mr *MockSuperviserMockRecorder) Register(arg0, arg1, arg2 interface{}) *gomock.Call {
+ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Register", reflect.TypeOf((*MockSuperviser)(nil).Register), arg0, arg1, arg2)
}
// SetFail mocks base method
package dryad
import (
- "crypto/rsa"
. "git.tizen.org/tools/boruta"
+ "golang.org/x/crypto/ssh"
"net/rpc"
)
// DryadPrepareRequest is a helper structure for Prepare method.
type DryadPrepareRequest struct {
- Key *rsa.PublicKey
+ Key *ssh.PublicKey
}
// DryadPrepareResponse is a helper structure for Prepare method.
}
// Prepare is part of implementation of Dryad calling corresponding method on RPC server.
-func (_c *DryadClient) Prepare(key *rsa.PublicKey) (err error) {
+func (_c *DryadClient) Prepare(key *ssh.PublicKey) (err error) {
_request := &DryadPrepareRequest{key}
_response := &DryadPrepareResponse{}
err = _c.client.Call("Dryad.Prepare", _request, _response)
package workers
import (
- rsa "crypto/rsa"
gomock "github.com/golang/mock/gomock"
+ ssh "golang.org/x/crypto/ssh"
net "net"
reflect "reflect"
)
}
// Prepare mocks base method
-func (m *MockDryadClientManager) Prepare(arg0 *rsa.PublicKey) error {
+func (m *MockDryadClientManager) Prepare(arg0 *ssh.PublicKey) error {
ret := m.ctrl.Call(m, "Prepare", arg0)
ret0, _ := ret[0].(error)
return ret0
It("should work to SetState", func() {
gomock.InOrder(
dcm.EXPECT().Create(info.dryad),
- dcm.EXPECT().Prepare(gomock.AssignableToTypeOf(&rsa.PublicKey{})).Return(nil),
+ dcm.EXPECT().Prepare(gomock.Any()).Return(nil),
dcm.EXPECT().Close(),
)
It("should fail to SetState if dryadClientManager fails to prepare client", func() {
gomock.InOrder(
dcm.EXPECT().Create(info.dryad),
- dcm.EXPECT().Prepare(gomock.AssignableToTypeOf(&rsa.PublicKey{})).Return(testerr),
+ dcm.EXPECT().Prepare(gomock.Any()).Return(testerr),
dcm.EXPECT().Close(),
)
})
It("should work to set and get information", func() {
+ // There's only 1 setter and 3 getters, so only 1st getter is checked in loop.
for i, set := range setters {
get := getters[i]
get(wl, worker, set(wl, worker, nil), nil)
}
+ getDryad(wl, worker, *dryadAddr, nil)
+ getSSH(wl, worker, *sshdAddr, nil)
})
})
Describe("PrepareWorker", func() {
It("should set worker into IDLE state and prepare a key", func() {
gomock.InOrder(
dcm.EXPECT().Create(info.dryad),
- dcm.EXPECT().Prepare(gomock.AssignableToTypeOf(&rsa.PublicKey{})).Return(nil),
+ dcm.EXPECT().Prepare(gomock.Any()).Return(nil),
dcm.EXPECT().Close(),
)
It("should fail to prepare worker if dryadClientManager fails to prepare client", func() {
gomock.InOrder(
dcm.EXPECT().Create(info.dryad),
- dcm.EXPECT().Prepare(gomock.AssignableToTypeOf(&rsa.PublicKey{})).Return(testerr),
+ dcm.EXPECT().Prepare(gomock.Any()).Return(testerr),
dcm.EXPECT().Close(),
)
. "git.tizen.org/tools/boruta"
"git.tizen.org/tools/boruta/rpc/dryad"
+ "golang.org/x/crypto/ssh"
)
// UUID denotes a key in Capabilities where WorkerUUID is stored.
if err != nil {
return err
}
- err = client.Prepare(&key.PublicKey)
+ pubKey, err := ssh.NewPublicKey(&key.PublicKey)
+ if err != nil {
+ return err
+ }
+ err = client.Prepare(&pubKey)
if err != nil {
return err
}