Try to do systemd calls in gosuper

This commit is contained in:
Pablo Carranza Vélez 2015-08-25 19:40:54 +00:00
parent 82f87527c8
commit 6f42fc2036
7 changed files with 66 additions and 47 deletions

View File

@ -66,7 +66,7 @@ gosuper: go-builder
test-gosuper: go-builder test-gosuper: go-builder
-docker rm --volumes -f resin_test_gosuper_$(JOB_NAME) || true -docker rm --volumes -f resin_test_gosuper_$(JOB_NAME) || true
docker run --name resin_test_gosuper_$(JOB_NAME) resin/go-supervisor-builder:$(SUPERVISOR_VERSION) bash -c "cd src/resin-supervisor/gosuper && ./test_formatting.sh && go test -v ./gosuper" docker run --name resin_test_gosuper_$(JOB_NAME) -v /var/run/dbus:/mnt/root/run/dbus resin/go-supervisor-builder:$(SUPERVISOR_VERSION) bash -c "cd src/resin-supervisor/gosuper && ./test_formatting.sh && go test -v ./gosuper"
docker rm --volumes -f resin_test_gosuper_$(JOB_NAME) docker rm --volumes -f resin_test_gosuper_$(JOB_NAME)
format-gosuper: go-builder format-gosuper: go-builder

View File

@ -7,6 +7,8 @@ import (
"net/http" "net/http"
"os" "os"
"strconv" "strconv"
"resin-supervisor/gosuper/systemd"
) )
type ApiResponse struct { type ApiResponse struct {
@ -51,12 +53,16 @@ func parsePurgeBody(request *http.Request) (appId string, err error) {
return return
} }
func responseSender(writer http.ResponseWriter) func(string, string, int) {
return func(statusMsg, errorMsg string, statusCode int) {
jsonResponse(writer, ApiResponse{statusMsg, errorMsg}, statusCode)
}
}
func PurgeHandler(writer http.ResponseWriter, request *http.Request) { func PurgeHandler(writer http.ResponseWriter, request *http.Request) {
log.Println("Purging /data") log.Println("Purging /data")
sendResponse := func(statusMsg, errorMsg string, statusCode int) { sendResponse := responseSender(writer)
jsonResponse(writer, ApiResponse{statusMsg, errorMsg}, statusCode)
}
sendError := func(err error) { sendError := func(err error) {
sendResponse("Error", err.Error(), http.StatusInternalServerError) sendResponse("Error", err.Error(), http.StatusInternalServerError)
} }
@ -84,3 +90,19 @@ func PurgeHandler(writer http.ResponseWriter, request *http.Request) {
sendResponse("OK", "", http.StatusOK) sendResponse("OK", "", http.StatusOK)
} }
} }
func RebootHandler(writer http.ResponseWriter, request *http.Request) {
log.Println("Rebooting")
sendResponse := responseSender(writer)
sendResponse("OK", "", http.StatusAccepted)
systemd.Reboot()
}
func ShutdownHandler(writer http.ResponseWriter, request *http.Request) {
log.Println("Shutting down")
sendResponse := responseSender(writer)
sendResponse("OK", "", http.StatusAccepted)
systemd.Shutdown()
}

View File

@ -19,6 +19,8 @@ func setupApi(router *mux.Router) {
apiv1 := router.PathPrefix("/v1").Subrouter() apiv1 := router.PathPrefix("/v1").Subrouter()
apiv1.HandleFunc("/purge", PurgeHandler).Methods("POST") apiv1.HandleFunc("/purge", PurgeHandler).Methods("POST")
apiv1.HandleFunc("/reboot", RebootHandler).Methods("POST")
apiv1.HandleFunc("/shutdown", ShutdownHandler).Methods("POST")
} }
func startApi(listenAddress string, router *mux.Router) { func startApi(listenAddress string, router *mux.Router) {

View File

@ -0,0 +1,34 @@
package systemd
import (
"log"
"os/exec"
"resin-supervisor/gosuper/Godeps/_workspace/src/github.com/godbus/dbus"
)
var Systemd dbus.BusObject
func init() {
if conn, err := dbus.Dial("unix:path=/mnt/root/run/dbus/system_bus_socket"); err != nil {
log.Fatal("Failed to connect to host system bus")
} else {
Systemd = conn.Object("org.freedesktop.systemd1", "/org/freedesktop/systemd1")
}
}
func Reboot() {
if err := exec.Command("sync").Run(); err != nil {
log.Println(err)
} else if call := Systemd.Call("org.freedesktop.systemd1.Reboot", 0); call.Err != nil {
log.Println(call.Err)
}
}
func Shutdown() {
if err := exec.Command("sync").Run(); err != nil {
log.Println(err)
} else if call := Systemd.Call("org.freedesktop.systemd1.PowerOff", 0); call.Err != nil {
log.Println(call.Err)
}
}

View File

@ -11,7 +11,6 @@
"bluebird": "^2.9.24", "bluebird": "^2.9.24",
"body-parser": "^1.12.0", "body-parser": "^1.12.0",
"coffee-script": "~1.9.1", "coffee-script": "~1.9.1",
"dbus-native": "^0.2.0",
"dockerode": "~2.2.1", "dockerode": "~2.2.1",
"event-stream": "^3.0.20", "event-stream": "^3.0.20",
"express": "^4.0.0", "express": "^4.0.0",

View File

@ -8,7 +8,6 @@ express = require 'express'
bodyParser = require 'body-parser' bodyParser = require 'body-parser'
request = require 'request' request = require 'request'
config = require './config' config = require './config'
systemd = require './systemd'
module.exports = (secret) -> module.exports = (secret) ->
api = express() api = express()
@ -65,13 +64,13 @@ module.exports = (secret) ->
api.post '/v1/reboot', (req, res) -> api.post '/v1/reboot', (req, res) ->
utils.mixpanelTrack('Reboot') utils.mixpanelTrack('Reboot')
res.sendStatus(200) request.post(config.gosuperAddress + '/v1/reboot')
systemd.reboot() .pipe(res)
api.post '/v1/shutdown', (req, res) -> api.post '/v1/shutdown', (req, res) ->
utils.mixpanelTrack('Shutdown') utils.mixpanelTrack('Shutdown')
res.sendStatus(200) request.post(config.gosuperAddress + '/v1/shutdown')
systemd.shutdown() .pipe(res)
api.post '/v1/purge', (req, res) -> api.post '/v1/purge', (req, res) ->
appId = req.body.appId appId = req.body.appId

View File

@ -1,37 +0,0 @@
Promise = require('bluebird')
dbus = require('dbus-native')
execAsync = Promise.promisify(require('child_process').exec)
systemBus = dbus.systemBus()
module.exports = systemd =
iface: null
init: ->
return new Promise (resolve, reject) ->
systemBus.getService('org.freedesktop.systemd1')
.getInterface '/org/freedesktop/systemd1', 'org.freedesktop.systemd1.Manager', (err, iface) ->
return reject(err) if err?
systemd.iface = iface
resolve()
proxyMethod: (method)->
args = Array.prototype.slice.call(arguments, 1)
Promise.try ->
return systemd.init() if !systemd.iface
.then ->
new Promise (resolve, reject) ->
cb = (err) ->
output = Array.prototype.slice.call(arguments, 1)
return reject(err) if err?
resolve(output)
args.push(cb)
systemd.iface[method].apply(systemd.iface, args)
shutdown: ->
execAsync('sync')
.then ->
systemd.proxyMethod('PowerOff')
reboot: ->
execAsync('sync')
.then ->
systemd.proxyMethod('Reboot')