mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-05-06 22:18:28 +00:00
Merge pull request #493 from apachelogger/api-over-socket
support serving the API over unix domain socket
This commit is contained in:
+1
-1
@@ -23,7 +23,7 @@ before_install:
|
|||||||
- . env/bin/activate
|
- . env/bin/activate
|
||||||
- pip install six packaging appdirs
|
- pip install six packaging appdirs
|
||||||
- pip install -U pip setuptools
|
- pip install -U pip setuptools
|
||||||
- pip install boto requests python-swiftclient
|
- pip install boto requests requests-unixsocket python-swiftclient
|
||||||
- mkdir -p $GOPATH/src/github.com/smira
|
- mkdir -p $GOPATH/src/github.com/smira
|
||||||
- ln -s $TRAVIS_BUILD_DIR $GOPATH/src/github.com/smira || true
|
- ln -s $TRAVIS_BUILD_DIR $GOPATH/src/github.com/smira || true
|
||||||
- cd $GOPATH/src/github.com/smira/aptly
|
- cd $GOPATH/src/github.com/smira/aptly
|
||||||
|
|||||||
+26
-3
@@ -2,11 +2,15 @@ package cmd
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/smira/aptly/api"
|
"github.com/smira/aptly/api"
|
||||||
"github.com/smira/aptly/utils"
|
"github.com/smira/aptly/utils"
|
||||||
"github.com/smira/commander"
|
"github.com/smira/commander"
|
||||||
"github.com/smira/flag"
|
"github.com/smira/flag"
|
||||||
"net/http"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func aptlyAPIServe(cmd *commander.Command, args []string) error {
|
func aptlyAPIServe(cmd *commander.Command, args []string) error {
|
||||||
@@ -34,6 +38,22 @@ func aptlyAPIServe(cmd *commander.Command, args []string) error {
|
|||||||
|
|
||||||
fmt.Printf("\nStarting web server at: %s (press Ctrl+C to quit)...\n", listen)
|
fmt.Printf("\nStarting web server at: %s (press Ctrl+C to quit)...\n", listen)
|
||||||
|
|
||||||
|
listenURL, err := url.Parse(listen)
|
||||||
|
if err == nil && listenURL.Scheme == "unix" {
|
||||||
|
file := listenURL.Path
|
||||||
|
os.Remove(file)
|
||||||
|
listener, err := net.Listen("unix", file)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to listen on: %s\n%s", file, err)
|
||||||
|
}
|
||||||
|
defer listener.Close()
|
||||||
|
err = http.Serve(listener, api.Router(context))
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unable to serve: %s", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
err = http.ListenAndServe(listen, api.Router(context))
|
err = http.ListenAndServe(listen, api.Router(context))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("unable to serve: %s", err)
|
return fmt.Errorf("unable to serve: %s", err)
|
||||||
@@ -48,16 +68,19 @@ func makeCmdAPIServe() *commander.Command {
|
|||||||
UsageLine: "serve",
|
UsageLine: "serve",
|
||||||
Short: "start API HTTP service",
|
Short: "start API HTTP service",
|
||||||
Long: `
|
Long: `
|
||||||
Stat HTTP server with aptly REST API.
|
Start HTTP server with aptly REST API. The server can listen to either a port
|
||||||
|
or Unix domain socket. When using a socket, Aptly will fully manage the socket
|
||||||
|
file.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
$ aptly api serve -listen=:8080
|
$ aptly api serve -listen=:8080
|
||||||
|
$ aptly api serve -listen=unix:///tmp/aptly.sock
|
||||||
`,
|
`,
|
||||||
Flag: *flag.NewFlagSet("aptly-serve", flag.ExitOnError),
|
Flag: *flag.NewFlagSet("aptly-serve", flag.ExitOnError),
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd.Flag.String("listen", ":8080", "host:port for HTTP listening")
|
cmd.Flag.String("listen", ":8080", "host:port for HTTP listening or unix://path to listen on a Unix domain socket")
|
||||||
cmd.Flag.Bool("no-lock", false, "don't lock the database")
|
cmd.Flag.Bool("no-lock", false, "don't lock the database")
|
||||||
|
|
||||||
return cmd
|
return cmd
|
||||||
|
|||||||
+6
-6
@@ -1685,20 +1685,17 @@ host:port for HTTP listening
|
|||||||
\fBaptly\fR \fBapi\fR \fBserve\fR
|
\fBaptly\fR \fBapi\fR \fBserve\fR
|
||||||
.
|
.
|
||||||
.P
|
.P
|
||||||
Stat HTTP server with aptly REST API\.
|
Start HTTP server with aptly REST API\. The server can listen to either a port or Unix domain socket\. When using a socket, Aptly will fully manage the socket file\.
|
||||||
.
|
.
|
||||||
.P
|
.P
|
||||||
Example:
|
Example: $ aptly api serve \-listen=:8080 $ aptly api serve \-listen=unix:///tmp/aptly\.sock
|
||||||
.
|
|
||||||
.P
|
|
||||||
$ aptly api serve \-listen=:8080
|
|
||||||
.
|
.
|
||||||
.P
|
.P
|
||||||
Options:
|
Options:
|
||||||
.
|
.
|
||||||
.TP
|
.TP
|
||||||
\-\fBlisten\fR=:8080
|
\-\fBlisten\fR=:8080
|
||||||
host:port for HTTP listening
|
host:port for HTTP listening or unix://path to listen on a Unix domain socket
|
||||||
.
|
.
|
||||||
.TP
|
.TP
|
||||||
\-\fBno\-lock\fR=false
|
\-\fBno\-lock\fR=false
|
||||||
@@ -1882,5 +1879,8 @@ Harald Sitter (https://github\.com/apachelogger)
|
|||||||
.IP "\[ci]" 4
|
.IP "\[ci]" 4
|
||||||
Johannes Layher (https://github\.com/jola5)
|
Johannes Layher (https://github\.com/jola5)
|
||||||
.
|
.
|
||||||
|
.IP "\[ci]" 4
|
||||||
|
Charles Hsu (https://github\.com/charz)
|
||||||
|
.
|
||||||
.IP "" 0
|
.IP "" 0
|
||||||
|
|
||||||
|
|||||||
@@ -9,3 +9,4 @@ from .version import *
|
|||||||
from .graph import *
|
from .graph import *
|
||||||
from .snapshots import *
|
from .snapshots import *
|
||||||
from .packages import *
|
from .packages import *
|
||||||
|
from .unix_socket import *
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
import requests_unixsocket
|
||||||
|
import time
|
||||||
|
import urllib
|
||||||
|
|
||||||
|
from lib import BaseTest
|
||||||
|
|
||||||
|
class UnixSocketAPITest(BaseTest):
|
||||||
|
aptly_server = None
|
||||||
|
socket_path = "/tmp/_aptly_test.sock"
|
||||||
|
base_url = ("unix://%s" % socket_path)
|
||||||
|
|
||||||
|
def prepare(self):
|
||||||
|
if self.aptly_server is None:
|
||||||
|
self.aptly_server = self._start_process("aptly api serve -no-lock -listen=%s" % (self.base_url),)
|
||||||
|
time.sleep(1)
|
||||||
|
super(UnixSocketAPITest, self).prepare()
|
||||||
|
|
||||||
|
def shutdown(self):
|
||||||
|
if self.aptly_server is not None:
|
||||||
|
self.aptly_server.terminate()
|
||||||
|
self.aptly_server.wait()
|
||||||
|
self.aptly_server = None
|
||||||
|
super(UnixSocketAPITest, self).shutdown()
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
"""
|
||||||
|
Verify we can listen on a unix domain socket.
|
||||||
|
"""
|
||||||
|
def check(self):
|
||||||
|
session = requests_unixsocket.Session()
|
||||||
|
r = session.get('http+unix://%s/api/version' % urllib.quote(UnixSocketAPITest.socket_path, safe=''))
|
||||||
|
# Just needs to come back, we actually don't care much about the code.
|
||||||
|
# Only needs to verify that the socket is actually responding.
|
||||||
|
self.check_equal(r.json(), {'Version': '0.9.8~dev'})
|
||||||
Reference in New Issue
Block a user