Commit 397aa1d1 authored by Geoff Simmons's avatar Geoff Simmons

Add haproxy controller code.

WIP -- testing currently incomplete.
parent e670a7bb
This diff is collapsed.
/*
* Copyright (c) 2020 UPLEX Nils Goroll Systemoptimierung
* All rights reserved
*
* Author: Geoffrey Simmons <geoffrey.simmons@uplex.de>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
package haproxy
import (
"net/http"
"net/url"
)
type FaccessError struct {
Status int
PEM string
}
func (err FaccessError) Error() string {
return err.PEM + ": " + http.StatusText(err.Status)
}
type FaccessClient struct {
baseURL *url.URL
client *http.Client
}
func NewFaccessClient(host string) *FaccessClient {
return &FaccessClient{
baseURL: &url.URL{
Scheme: "http",
Host: host,
},
client: http.DefaultClient,
}
}
func (client *FaccessClient) getHost() string {
return client.baseURL.Host
}
func (client *FaccessClient) PEMExists(spec Spec) (bool, error) {
relPath := &url.URL{Path: spec.CertName()}
url := client.baseURL.ResolveReference(relPath)
req, err := http.NewRequest(http.MethodHead, url.String(), nil)
if err != nil {
return false, err
}
resp, err := client.client.Do(req)
if err != nil {
return false, err
}
defer drainAndClose(resp.Body)
switch resp.StatusCode {
case http.StatusNoContent:
return true, nil
case http.StatusNotFound:
return false, nil
default:
return false, &FaccessError{
Status: resp.StatusCode,
PEM: spec.CertName(),
}
}
}
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment