chore: remove unused CircleCI scripts (#24701)
parent
8fec1d636e
commit
3dcf2778d6
|
@ -1,48 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -o nounset \
|
|
||||||
-o errexit \
|
|
||||||
-o pipefail
|
|
||||||
|
|
||||||
REGEX_TAG='v([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)'
|
|
||||||
|
|
||||||
function semver_tags()
|
|
||||||
{
|
|
||||||
{
|
|
||||||
# Sometimes several release tags point to the same commit (see v1.9.0 and
|
|
||||||
# v1.9.1). This iterates through each tag and ensures that it conforms to
|
|
||||||
# semantic versioning requirements. Afterwards, the tags are sorted from
|
|
||||||
# latest to earliest. This is so packages use the latest version tag.
|
|
||||||
for tag in $(git tag --points-at HEAD)
|
|
||||||
do
|
|
||||||
if [[ ${tag} =~ ^${REGEX_TAG}$ ]]
|
|
||||||
then
|
|
||||||
printf '%s\n' "${tag}"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
} | sort --version-sort --reverse
|
|
||||||
}
|
|
||||||
|
|
||||||
TAG=$(head -n 1 <<<"$(semver_tags)")
|
|
||||||
|
|
||||||
# If no tag could be found for the corresponding commit, assume that this
|
|
||||||
# is being built from an unversioned branch. In which case, this will
|
|
||||||
# construct a version that is compatible with Debian versioning:
|
|
||||||
# ${PREFIX}-<< short commit hash >>
|
|
||||||
if [[ ${TAG} =~ ^${REGEX_TAG}$ ]]
|
|
||||||
then
|
|
||||||
cat <<EOF >>"${BASH_ENV}"
|
|
||||||
export VERSION="${TAG:1}"
|
|
||||||
export MAJOR=${BASH_REMATCH[1]}
|
|
||||||
export MINOR=${BASH_REMATCH[2]}
|
|
||||||
export PATCH=${BASH_REMATCH[3]}
|
|
||||||
export RELEASE=1
|
|
||||||
EOF
|
|
||||||
else
|
|
||||||
cat <<EOF >>"${BASH_ENV}"
|
|
||||||
export VERSION="${PREFIX}-$(git rev-parse --short HEAD)"
|
|
||||||
export MAJOR=
|
|
||||||
export MINOR=
|
|
||||||
export PATCH=
|
|
||||||
export RELEASE=
|
|
||||||
EOF
|
|
||||||
fi
|
|
|
@ -1,7 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
if [[ "${MACHTYPE}" == "arm64-apple-darwin"* ]]
|
|
||||||
then
|
|
||||||
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
|
|
||||||
fi
|
|
|
@ -1,8 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -o errexit \
|
|
||||||
-o nounset \
|
|
||||||
-o pipefail
|
|
||||||
|
|
||||||
path="$(dirname "$(realpath "${BASH_SOURCE[0]}")")"
|
|
||||||
|
|
||||||
"${path}/validate" deb "${1}"
|
|
|
@ -1,97 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -o errexit \
|
|
||||||
-o nounset \
|
|
||||||
-o pipefail
|
|
||||||
|
|
||||||
# $1 -> architecture
|
|
||||||
# $2 -> package path
|
|
||||||
case ${1} in
|
|
||||||
x86_64) arch=x86_64 ;;
|
|
||||||
aarch64) arch=arm64 ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
package="$(realpath "${2}")"
|
|
||||||
|
|
||||||
path="$(dirname "$(realpath "${BASH_SOURCE[0]}")")"
|
|
||||||
|
|
||||||
terraform_init() {
|
|
||||||
pushd "${path}/tf" &>/dev/null
|
|
||||||
|
|
||||||
# Unfortunately, CircleCI doesn't offer any RPM based machine images.
|
|
||||||
# This is required to test the functionality of the systemd services.
|
|
||||||
# (systemd doesn't run within docker containers). This will spawn a
|
|
||||||
# Amazon Linux instance in AWS.
|
|
||||||
terraform init
|
|
||||||
terraform apply \
|
|
||||||
-auto-approve \
|
|
||||||
-var "architecture=${1}" \
|
|
||||||
-var "package_path=${2}" \
|
|
||||||
-var "identifier=${CIRCLE_JOB}"
|
|
||||||
|
|
||||||
popd &>/dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
terraform_free() {
|
|
||||||
pushd "${path}/tf" &>/dev/null
|
|
||||||
|
|
||||||
terraform destroy \
|
|
||||||
-auto-approve \
|
|
||||||
-var "architecture=${1}" \
|
|
||||||
-var "package_path=${2}" \
|
|
||||||
-var "identifier=${CIRCLE_JOB}"
|
|
||||||
|
|
||||||
popd &>/dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
terraform_ip() {
|
|
||||||
pushd "${path}/tf" &>/dev/null
|
|
||||||
|
|
||||||
terraform output -raw node_ssh
|
|
||||||
|
|
||||||
popd &>/dev/null
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# This ensures that the associated resources within AWS are released
|
|
||||||
# upon exit or when encountering an error. This is setup before the
|
|
||||||
# call to "terraform apply" so even partially initialized resources
|
|
||||||
# are released.
|
|
||||||
# shellcheck disable=SC2064
|
|
||||||
trap "terraform_free \"${arch}\" \"${package}\"" \
|
|
||||||
SIGINT \
|
|
||||||
SIGTERM \
|
|
||||||
ERR \
|
|
||||||
EXIT
|
|
||||||
|
|
||||||
function terraform_setup()
|
|
||||||
{
|
|
||||||
# TODO(bnpfeife): remove this once the executor is updated.
|
|
||||||
#
|
|
||||||
# Unfortunately, terraform provided by the CircleCI executor is *terribly*
|
|
||||||
# out of date. Most Linux distributions are disabling "ssh-rsa" public key
|
|
||||||
# algorithms which this uses to remote into the ec2 instance . This
|
|
||||||
# installs the latest version of terraform.
|
|
||||||
#
|
|
||||||
# Addendum: the "terraform_version" CircleCI option is broken!
|
|
||||||
sudo tee /etc/apt/sources.list.d/hashicorp.list <<EOF >/dev/null || true
|
|
||||||
deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main
|
|
||||||
EOF
|
|
||||||
|
|
||||||
curl -fL https://apt.releases.hashicorp.com/gpg | gpg --dearmor | \
|
|
||||||
sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg >/dev/null
|
|
||||||
|
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
|
||||||
sudo -E apt-get update
|
|
||||||
sudo -E apt-get install --yes terraform
|
|
||||||
}
|
|
||||||
|
|
||||||
terraform_setup
|
|
||||||
|
|
||||||
terraform_init "${arch}" "${package}"
|
|
||||||
|
|
||||||
printf 'Setup complete! Testing %s... (this takes several minutes!)' "${1}"
|
|
||||||
|
|
||||||
# Since terraform *just* created this instance, the host key is not
|
|
||||||
# known. Therefore, we'll disable StrictHostKeyChecking so ssh does
|
|
||||||
# not wait for user input.
|
|
||||||
ssh -o 'StrictHostKeyChecking=no' "ec2-user@$(terraform_ip)" 'sudo ./validate rpm ./influxdb2.rpm'
|
|
|
@ -1,114 +0,0 @@
|
||||||
terraform {
|
|
||||||
required_providers {
|
|
||||||
aws = {
|
|
||||||
source = "hashicorp/aws"
|
|
||||||
version = "~> 2.70"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
variable "architecture" {
|
|
||||||
type = string
|
|
||||||
}
|
|
||||||
|
|
||||||
variable "identifier" {
|
|
||||||
type = string
|
|
||||||
}
|
|
||||||
|
|
||||||
variable "package_path" {
|
|
||||||
type = string
|
|
||||||
}
|
|
||||||
|
|
||||||
provider "aws" {
|
|
||||||
region = "us-east-1"
|
|
||||||
}
|
|
||||||
|
|
||||||
data "aws_ami" "test_ami" {
|
|
||||||
most_recent = true
|
|
||||||
|
|
||||||
filter {
|
|
||||||
name = "name"
|
|
||||||
values = ["al20*-ami-20*"]
|
|
||||||
}
|
|
||||||
filter {
|
|
||||||
name = "virtualization-type"
|
|
||||||
values = ["hvm"]
|
|
||||||
}
|
|
||||||
filter {
|
|
||||||
name = "architecture"
|
|
||||||
values = [var.architecture]
|
|
||||||
}
|
|
||||||
|
|
||||||
owners = ["137112412989"]
|
|
||||||
}
|
|
||||||
|
|
||||||
resource "aws_security_group" "influxdb_test_package_sg" {
|
|
||||||
ingress {
|
|
||||||
description = "Allow ssh connection"
|
|
||||||
from_port = 22
|
|
||||||
to_port = 22
|
|
||||||
protocol = "tcp"
|
|
||||||
cidr_blocks = ["0.0.0.0/0"]
|
|
||||||
}
|
|
||||||
|
|
||||||
egress {
|
|
||||||
description = "Allow all outgoing"
|
|
||||||
from_port = 0
|
|
||||||
to_port = 0
|
|
||||||
protocol = "all"
|
|
||||||
cidr_blocks = ["0.0.0.0/0"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
resource "aws_instance" "test_instance" {
|
|
||||||
count = 1
|
|
||||||
ami = data.aws_ami.test_ami.id
|
|
||||||
instance_type = var.architecture == "x86_64" ? "t2.micro" : "c6g.medium"
|
|
||||||
key_name = "circleci-oss-test"
|
|
||||||
vpc_security_group_ids = [aws_security_group.influxdb_test_package_sg.id]
|
|
||||||
|
|
||||||
tags = {
|
|
||||||
Name = format("circleci_%s_test_%s", var.identifier, var.architecture)
|
|
||||||
}
|
|
||||||
|
|
||||||
provisioner "file" {
|
|
||||||
source = var.package_path
|
|
||||||
destination = "/home/ec2-user/influxdb2.rpm"
|
|
||||||
|
|
||||||
connection {
|
|
||||||
type = "ssh"
|
|
||||||
user = "ec2-user"
|
|
||||||
host = self.public_dns
|
|
||||||
agent = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
provisioner "file" {
|
|
||||||
source = "../validate"
|
|
||||||
destination = "/home/ec2-user/validate"
|
|
||||||
|
|
||||||
connection {
|
|
||||||
type = "ssh"
|
|
||||||
user = "ec2-user"
|
|
||||||
host = self.public_dns
|
|
||||||
agent = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
provisioner "remote-exec" {
|
|
||||||
inline = [
|
|
||||||
"chmod +x /home/ec2-user/validate",
|
|
||||||
]
|
|
||||||
|
|
||||||
connection {
|
|
||||||
type = "ssh"
|
|
||||||
user = "ec2-user"
|
|
||||||
host = self.public_dns
|
|
||||||
agent = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
output "node_ssh" {
|
|
||||||
value = aws_instance.test_instance.0.public_dns
|
|
||||||
}
|
|
|
@ -1,116 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -o errexit \
|
|
||||||
-o nounset \
|
|
||||||
-o pipefail
|
|
||||||
|
|
||||||
usage() {
|
|
||||||
cat <<'EOF'
|
|
||||||
usage: validate [type] [path]
|
|
||||||
|
|
||||||
Program:
|
|
||||||
This application performs sanity checks on the provided InfluxDB
|
|
||||||
package. InfluxDB should *not* be installed on the system before
|
|
||||||
running this application. This validates new installations and
|
|
||||||
performs specific checks relevant only to InfluxDB.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
type Must be "deb" or "rpm". This option instructs the
|
|
||||||
application to use the package manager associated
|
|
||||||
with "type".
|
|
||||||
path Path to InfluxDB package to validate.
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
if [[ ! "${1:-}" ]] || [[ ! "${2:-}" ]]
|
|
||||||
then
|
|
||||||
(usage) && exit 1
|
|
||||||
fi
|
|
||||||
PACKAGE_TYPE="${1}"
|
|
||||||
PACKAGE_PATH="${2}"
|
|
||||||
|
|
||||||
install_deb() {
|
|
||||||
# When installing the package, ensure that the latest repository listings
|
|
||||||
# are available. This might be required so that all dependencies resolve.
|
|
||||||
# Since this needs to be run by CI, we supply "noninteractive" and "-y"
|
|
||||||
# so no prompts stall the pipeline.
|
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
|
||||||
apt-get update
|
|
||||||
# "apt-get install" should be used instead of "dpkg -i", because "dpkg"
|
|
||||||
# does not resolve dependencies. "apt-get" requires that the package
|
|
||||||
# path looks like a path (either fullpath or prefixed with "./").
|
|
||||||
apt-get install -y binutils "$(realpath "${PACKAGE_PATH}")"
|
|
||||||
}
|
|
||||||
|
|
||||||
install_rpm() {
|
|
||||||
# see "install_deb" for "update"
|
|
||||||
yum update -y
|
|
||||||
yum install -y binutils
|
|
||||||
yum localinstall -y "$(realpath "${PACKAGE_PATH}")"
|
|
||||||
}
|
|
||||||
|
|
||||||
case ${PACKAGE_TYPE}
|
|
||||||
in
|
|
||||||
deb)
|
|
||||||
(install_deb)
|
|
||||||
;;
|
|
||||||
rpm)
|
|
||||||
(install_rpm)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if ! which influxd &>/dev/null
|
|
||||||
then
|
|
||||||
printf 'ERROR: Failed to locate influxd executable!\n' >&2
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
NEEDED="$(readelf -d "$(which influxd)" | (grep 'NEEDED' || true ))"
|
|
||||||
|
|
||||||
# shellcheck disable=SC2181
|
|
||||||
if [[ ${?} -ne 0 ]]
|
|
||||||
then
|
|
||||||
cat <<'EOF'
|
|
||||||
ERROR: readelf could not analyze the influxd executable! This
|
|
||||||
might be the consequence of installing a package built
|
|
||||||
for another platform OR invalid compiler/linker flags.
|
|
||||||
EOF
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "${NEEDED:-}" ]]
|
|
||||||
then
|
|
||||||
cat <<'EOF'
|
|
||||||
ERROR: influxd not statically linked! This may prevent all
|
|
||||||
platforms from running influxd without installing
|
|
||||||
separate dependencies.
|
|
||||||
EOF
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
PIE="$(readelf -d "$(which influxd)" | (grep 'Flags: PIE' || true))"
|
|
||||||
if [[ ! "${PIE:-}" ]]
|
|
||||||
then
|
|
||||||
printf 'ERROR: influxd not linked with "-fPIE"!\n'
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! systemctl is-active influxdb &>/dev/null
|
|
||||||
then
|
|
||||||
systemctl start influxdb
|
|
||||||
fi
|
|
||||||
|
|
||||||
for i in 0..2
|
|
||||||
do
|
|
||||||
if ! systemctl is-active influxdb &>/dev/null
|
|
||||||
then
|
|
||||||
printf 'ERROR: influxdb service failed to start!\n'
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
# Sometimes the service fails several seconds or minutes after
|
|
||||||
# starting. This failure may not propagate to the original
|
|
||||||
# "systemctl start <influxdb>" command. Therefore, we'll
|
|
||||||
# poll the service several times before exiting.
|
|
||||||
sleep 30
|
|
||||||
done
|
|
||||||
|
|
||||||
printf 'Finished validating influxdb!\n'
|
|
|
@ -1,383 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import shutil
|
|
||||||
import subprocess
|
|
||||||
import tempfile
|
|
||||||
import yaml
|
|
||||||
|
|
||||||
|
|
||||||
def build_linux_archive(source, package, version):
|
|
||||||
"""
|
|
||||||
Builds a Linux Archive.
|
|
||||||
|
|
||||||
This archive contains the binary artifacts, configuration, and scripts
|
|
||||||
installed by the DEB and RPM packages. This mimics the file-system. So,
|
|
||||||
binaries are installed into "/usr/bin", configuration into "/etc", and
|
|
||||||
scripts into their relevant directories. Permissions match those of
|
|
||||||
the DEB and RPM packages.
|
|
||||||
"""
|
|
||||||
with tempfile.TemporaryDirectory() as workspace:
|
|
||||||
# fmt: off
|
|
||||||
shutil.copytree(os.path.join(package["source"], "fs"),
|
|
||||||
workspace, dirs_exist_ok=True, ignore=shutil.ignore_patterns(".keepdir"))
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
for extra in package["extras"]:
|
|
||||||
# fmt: off
|
|
||||||
shutil.copy(extra["source"],
|
|
||||||
os.path.join(workspace, extra["target"]))
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
for binary in package["binaries"]:
|
|
||||||
target = os.path.join(source["binary"], binary)
|
|
||||||
|
|
||||||
if os.path.exists(target):
|
|
||||||
# fmt: off
|
|
||||||
shutil.copy(target,
|
|
||||||
os.path.join(workspace, "usr/bin", os.path.basename(target)))
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
# After the package contents are copied into the working directory,
|
|
||||||
# the permissions must be updated. Since the CI executor may change
|
|
||||||
# occasionally (images/ORBs deprecated over time), the umask may
|
|
||||||
# not be what we expect. This allows this packaging script to be
|
|
||||||
# agnostic to umask/system configuration.
|
|
||||||
for root, dirs, files in os.walk(workspace):
|
|
||||||
for target in [os.path.join(root, f) for f in files]:
|
|
||||||
# files in "usr/bin" are executable
|
|
||||||
if os.path.relpath(root, workspace) == "usr/bin":
|
|
||||||
os.chmod(target, 0o0755)
|
|
||||||
else:
|
|
||||||
# standard file permissions
|
|
||||||
os.chmod(target, 0o0644)
|
|
||||||
# fmt: off
|
|
||||||
shutil.chown(
|
|
||||||
target,
|
|
||||||
user = "root",
|
|
||||||
group = "root")
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
for target in [os.path.join(root, d) for d in dirs]:
|
|
||||||
# standard directory permissions
|
|
||||||
os.chmod(target, 0o0755)
|
|
||||||
# fmt: off
|
|
||||||
shutil.chown(
|
|
||||||
target,
|
|
||||||
user = "root",
|
|
||||||
group = "root")
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
for override in package["perm_overrides"]:
|
|
||||||
target = os.path.join(workspace, override["target"])
|
|
||||||
os.chmod(target, override["perms"])
|
|
||||||
# "owner" and "group" should be a system account and group with
|
|
||||||
# a well-defined UID and GID. Otherwise, the UID/GID might vary
|
|
||||||
# between systems. When the archive is extracted/package is
|
|
||||||
# installed, things may not behave as we would expect.
|
|
||||||
# fmt: off
|
|
||||||
shutil.chown(
|
|
||||||
target,
|
|
||||||
user = override["owner"],
|
|
||||||
group = override["group"])
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
os.makedirs(source["target"], exist_ok=True)
|
|
||||||
|
|
||||||
# fmt: off
|
|
||||||
subprocess.check_call([
|
|
||||||
"tar", "-czf",
|
|
||||||
os.path.join(
|
|
||||||
source["target"],
|
|
||||||
"{:s}-{:s}_{:s}_{:s}.tar.gz".format(
|
|
||||||
package["name"],
|
|
||||||
version,
|
|
||||||
source["plat"],
|
|
||||||
source["arch"]
|
|
||||||
)
|
|
||||||
),
|
|
||||||
# ".keepdir" allows Git to track otherwise empty directories. The presence
|
|
||||||
# of the directories allows `package["extras"]` and `package["binaries"]`
|
|
||||||
# to be copied into the archive without requiring "mkdir". These should
|
|
||||||
# directories are excluded from the final archive.
|
|
||||||
"--exclude", ".keepdir",
|
|
||||||
# This re-parents the contents of the archive with `package["name"]-version`.
|
|
||||||
# It is undocumented, however, when matching, "--transform" always removes
|
|
||||||
# the trailing slash. This regex must handle "./" and "./<more components>".
|
|
||||||
"--transform",
|
|
||||||
"s#^.\(/\|$\)#{:s}-{:s}/#".format(
|
|
||||||
package["name"],
|
|
||||||
version
|
|
||||||
),
|
|
||||||
# compress everything within `workspace`
|
|
||||||
"-C", workspace, '.'
|
|
||||||
])
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
|
|
||||||
def build_archive(source, package, version):
|
|
||||||
"""
|
|
||||||
Builds Archive for other (not-Linux) Platforms.
|
|
||||||
|
|
||||||
This archive contains binary artifacts and configuration. Unlike the
|
|
||||||
linux archive, which contains the configuration and matches the file-
|
|
||||||
system of the DEB and RPM packages, everything is located within the
|
|
||||||
root of the archive. However, permissions do match those of the DEB
|
|
||||||
and RPM packages.
|
|
||||||
"""
|
|
||||||
with tempfile.TemporaryDirectory() as workspace:
|
|
||||||
for extra in package["extras"]:
|
|
||||||
# fmt: off
|
|
||||||
target = os.path.join(workspace,
|
|
||||||
os.path.basename(extra["target"]))
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
shutil.copy(extra["source"], target)
|
|
||||||
os.chmod(target, 0o0644)
|
|
||||||
# fmt: off
|
|
||||||
shutil.chown(
|
|
||||||
target,
|
|
||||||
user = "root",
|
|
||||||
group = "root")
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
for binary in package["binaries"]:
|
|
||||||
target = os.path.join(source["binary"], binary)
|
|
||||||
|
|
||||||
if os.path.exists(target):
|
|
||||||
# fmt: off
|
|
||||||
shutil.copy(target,
|
|
||||||
os.path.join(workspace, os.path.basename(target)))
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
os.chmod(target, 0o0755)
|
|
||||||
# fmt: off
|
|
||||||
shutil.chown(
|
|
||||||
target,
|
|
||||||
user = "root",
|
|
||||||
group = "root")
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
os.makedirs(source["target"], exist_ok=True)
|
|
||||||
|
|
||||||
if source["plat"] == "darwin":
|
|
||||||
# fmt: off
|
|
||||||
subprocess.check_call([
|
|
||||||
"tar", "-czf",
|
|
||||||
os.path.join(
|
|
||||||
source["target"],
|
|
||||||
"{:s}-{:s}_{:s}_{:s}.tar.gz".format(
|
|
||||||
package["name"],
|
|
||||||
version,
|
|
||||||
source["plat"],
|
|
||||||
source["arch"]
|
|
||||||
)
|
|
||||||
),
|
|
||||||
# This re-parents the contents of the archive with `package["name"]-version`.
|
|
||||||
# It is undocumented, however, when matching, "--transform" always removes
|
|
||||||
# the trailing slash. This regex must handle "./" and "./<more components>".
|
|
||||||
"--transform",
|
|
||||||
"s#^.\(/\|$\)#{:s}-{:s}/#".format(
|
|
||||||
package["name"],
|
|
||||||
version
|
|
||||||
),
|
|
||||||
# compress everything within `workspace`
|
|
||||||
"-C", workspace, '.'
|
|
||||||
])
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
if source["plat"] == "windows":
|
|
||||||
# preserve current working directory
|
|
||||||
current = os.getcwd()
|
|
||||||
|
|
||||||
for root, dirs, files in os.walk(workspace):
|
|
||||||
for file in files:
|
|
||||||
# Unfortunately, it looks like "-r" cannot be combined with
|
|
||||||
# "-j" (which strips the path of input files). This changes
|
|
||||||
# directory to the current input file and *then* appends it
|
|
||||||
# to the archive.
|
|
||||||
os.chdir(os.path.join(workspace, root))
|
|
||||||
|
|
||||||
# fmt: off
|
|
||||||
subprocess.check_call([
|
|
||||||
"zip", "-r",
|
|
||||||
os.path.join(
|
|
||||||
os.path.join(current, source["target"]),
|
|
||||||
"{:s}-{:s}-{:s}.zip".format(
|
|
||||||
package["name"],
|
|
||||||
version,
|
|
||||||
source["plat"],
|
|
||||||
source["arch"]
|
|
||||||
)
|
|
||||||
),
|
|
||||||
file
|
|
||||||
])
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
# restore current working directory
|
|
||||||
os.chdir(current)
|
|
||||||
|
|
||||||
|
|
||||||
def build_linux_package(source, package, version):
|
|
||||||
"""
|
|
||||||
Constructs a DEB or RPM Package.
|
|
||||||
"""
|
|
||||||
with tempfile.TemporaryDirectory() as workspace:
|
|
||||||
# fmt: off
|
|
||||||
shutil.copytree(package["source"], workspace,
|
|
||||||
dirs_exist_ok=True, ignore=shutil.ignore_patterns(".keepdir"))
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
for extra in package["extras"]:
|
|
||||||
# fmt: off
|
|
||||||
shutil.copy(extra["source"],
|
|
||||||
os.path.join(workspace, "fs", extra["target"]))
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
for binary in package["binaries"]:
|
|
||||||
target = os.path.join(source["binary"], binary)
|
|
||||||
|
|
||||||
if os.path.exists(target):
|
|
||||||
# fmt: off
|
|
||||||
shutil.copy(target,
|
|
||||||
os.path.join(workspace, "fs/usr/bin", os.path.basename(target)))
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
# After the package contents are copied into the working directory,
|
|
||||||
# the permissions must be updated. Since the CI executor may change
|
|
||||||
# occasionally (images/ORBs deprecated over time), the umask may
|
|
||||||
# not be what we expect. This allows this packaging script to be
|
|
||||||
# agnostic to umask/system configuration.
|
|
||||||
for root, dirs, files in os.walk(workspace):
|
|
||||||
for target in [os.path.join(root, f) for f in files]:
|
|
||||||
# files in "fs/usr/bin" are executable
|
|
||||||
if os.path.relpath(root, workspace) == "fs/usr/bin":
|
|
||||||
os.chmod(target, 0o0755)
|
|
||||||
else:
|
|
||||||
# standard file permissions
|
|
||||||
os.chmod(target, 0o0644)
|
|
||||||
# fmt: off
|
|
||||||
shutil.chown(
|
|
||||||
target,
|
|
||||||
user = "root",
|
|
||||||
group = "root")
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
for target in [os.path.join(root, d) for d in dirs]:
|
|
||||||
# standard directory permissions
|
|
||||||
os.chmod(target, 0o0755)
|
|
||||||
# fmt: off
|
|
||||||
shutil.chown(
|
|
||||||
target,
|
|
||||||
user = "root",
|
|
||||||
group = "root")
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
for override in package["perm_overrides"]:
|
|
||||||
target = os.path.join(workspace, "fs", override["target"])
|
|
||||||
os.chmod(target, override["perms"])
|
|
||||||
# "owner" and "group" should be a system account and group with
|
|
||||||
# a well-defined UID and GID. Otherwise, the UID/GID might vary
|
|
||||||
# between systems. When the archive is extracted/package is
|
|
||||||
# installed, things may not behave as we would expect.
|
|
||||||
# fmt: off
|
|
||||||
shutil.chown(
|
|
||||||
target,
|
|
||||||
user = override["owner"],
|
|
||||||
group = override["group"])
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
os.makedirs(source["target"], exist_ok=True)
|
|
||||||
fpm_wrapper(source, package, version, workspace, "rpm")
|
|
||||||
fpm_wrapper(source, package, version, workspace, "deb")
|
|
||||||
|
|
||||||
|
|
||||||
def fpm_wrapper(source, package, version, workspace, package_type):
|
|
||||||
"""
|
|
||||||
Constructs either a DEB/RPM Package.
|
|
||||||
|
|
||||||
This wraps some configuration settings that are *only* relevant
|
|
||||||
to `fpm`.
|
|
||||||
"""
|
|
||||||
|
|
||||||
conffiles = []
|
|
||||||
for root, dirs, files in os.walk(os.path.join(workspace, "fs/etc")):
|
|
||||||
for file in files:
|
|
||||||
# fmt: off
|
|
||||||
conffiles.extend([
|
|
||||||
"--config-files", os.path.join("/", os.path.relpath(root, os.path.join(workspace, "fs")), file)
|
|
||||||
])
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
# `source["arch"]` matches DEB architecture names. When building RPMs, it must
|
|
||||||
# be converted into RPM architecture names.
|
|
||||||
architecture = source["arch"]
|
|
||||||
if package_type == "rpm":
|
|
||||||
if architecture == "amd64":
|
|
||||||
architecture = "x86_64"
|
|
||||||
if architecture == "arm64":
|
|
||||||
architecture = "aarch64"
|
|
||||||
|
|
||||||
# fmt: off
|
|
||||||
p = subprocess.check_call([
|
|
||||||
"fpm",
|
|
||||||
"--log", "error",
|
|
||||||
# package description
|
|
||||||
"--name", package["name"],
|
|
||||||
"--vendor", "InfluxData",
|
|
||||||
"--description", "Distributed time-series database.",
|
|
||||||
"--url", "https://influxdata.com",
|
|
||||||
"--maintainer", "support@influxdb.com",
|
|
||||||
"--license", "MIT",
|
|
||||||
# package configuration
|
|
||||||
"--input-type", "dir",
|
|
||||||
"--output-type", package_type,
|
|
||||||
"--architecture", architecture,
|
|
||||||
"--version", version,
|
|
||||||
"--iteration", "1",
|
|
||||||
# maintainer scripts
|
|
||||||
"--after-install", os.path.join(workspace, "control/postinst"),
|
|
||||||
"--after-remove", os.path.join(workspace, "control/postrm"),
|
|
||||||
"--before-install", os.path.join(workspace, "control/preinst"),
|
|
||||||
# package relationships
|
|
||||||
"--deb-recommends", "influxdb2-cli",
|
|
||||||
"--conflicts", "influxdb",
|
|
||||||
"--depends", "curl",
|
|
||||||
# package conffiles
|
|
||||||
*conffiles,
|
|
||||||
# package options
|
|
||||||
"--chdir", os.path.join(workspace, "fs/"),
|
|
||||||
"--package", source["target"]
|
|
||||||
])
|
|
||||||
# fmt: on
|
|
||||||
|
|
||||||
|
|
||||||
circle_tag = os.getenv("CIRCLE_TAG", default="")
|
|
||||||
circle_sha = os.getenv("CIRCLE_SHA1", default="DEADBEEF")
|
|
||||||
# Determine if `circle_tag` matches the semantic version regex. Otherwise,
|
|
||||||
# assume that `circle_tag` is not intended to tag a release. The regex is
|
|
||||||
# permissive of what occurs after the semantic version. This allows for
|
|
||||||
# alphas, betas, and release candidates.
|
|
||||||
if re.match("^v[0-9]+.[0-9]+.[0-9]+", circle_tag):
|
|
||||||
version = circle_tag[1:]
|
|
||||||
else:
|
|
||||||
# When `circle_tag` cannot be used to construct the package version,
|
|
||||||
# use `circle_sha`. Since `circle_sha` can start with an alpha (non-
|
|
||||||
# -numeric) character, prefix it with "2.x-".
|
|
||||||
version = "2.x-" + circle_sha[:8]
|
|
||||||
|
|
||||||
with open(".circleci/scripts/package/config.yaml") as file:
|
|
||||||
document = yaml.load(file, Loader=yaml.SafeLoader)
|
|
||||||
|
|
||||||
# fmt: off
|
|
||||||
for s, p in [
|
|
||||||
(s, p)
|
|
||||||
for s in document["sources" ]
|
|
||||||
for p in document["packages"]
|
|
||||||
]:
|
|
||||||
# fmt: on
|
|
||||||
if s["plat"] == "linux":
|
|
||||||
build_linux_archive(s, p, version)
|
|
||||||
build_linux_package(s, p, version)
|
|
||||||
if s["plat"] == "darwin" or s["plat"] == "windows":
|
|
||||||
build_archive(s, p, version)
|
|
|
@ -1,49 +0,0 @@
|
||||||
---
|
|
||||||
sources:
|
|
||||||
- binary: /tmp/workspace/bin/influxd_linux_amd64/
|
|
||||||
target: artifacts/
|
|
||||||
arch: amd64
|
|
||||||
plat: linux
|
|
||||||
|
|
||||||
- binary: /tmp/workspace/bin/influxd_linux_arm64/
|
|
||||||
target: artifacts/
|
|
||||||
arch: arm64
|
|
||||||
plat: linux
|
|
||||||
|
|
||||||
- binary: /tmp/workspace/bin/influxd_darwin_amd64/
|
|
||||||
target: artifacts/
|
|
||||||
arch: amd64
|
|
||||||
plat: darwin
|
|
||||||
|
|
||||||
- binary: /tmp/workspace/bin/influxd_windows_amd64/
|
|
||||||
target: artifacts/
|
|
||||||
arch: amd64
|
|
||||||
plat: windows
|
|
||||||
|
|
||||||
packages:
|
|
||||||
- name: influxdb2
|
|
||||||
binaries:
|
|
||||||
- influxd
|
|
||||||
- influxd.exe
|
|
||||||
extras:
|
|
||||||
- source: LICENSE
|
|
||||||
target: usr/share/influxdb/LICENSE
|
|
||||||
|
|
||||||
- source: README.md
|
|
||||||
target: usr/share/influxdb/README.md
|
|
||||||
perm_overrides:
|
|
||||||
- owner: root
|
|
||||||
group: root
|
|
||||||
perms: 0755
|
|
||||||
target: usr/share/influxdb/influxdb2-upgrade.sh
|
|
||||||
|
|
||||||
- owner: root
|
|
||||||
group: root
|
|
||||||
perms: 0755
|
|
||||||
target: usr/lib/influxdb/scripts/init.sh
|
|
||||||
|
|
||||||
- owner: root
|
|
||||||
group: root
|
|
||||||
perms: 0755
|
|
||||||
target: usr/lib/influxdb/scripts/influxd-systemd-start.sh
|
|
||||||
source: .circleci/scripts/package/influxdb2
|
|
|
@ -1,142 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
BIN_DIR=/usr/bin
|
|
||||||
DATA_DIR=/var/lib/influxdb
|
|
||||||
LOG_DIR=/var/log/influxdb
|
|
||||||
SCRIPT_DIR=/usr/lib/influxdb/scripts
|
|
||||||
LOGROTATE_DIR=/etc/logrotate.d
|
|
||||||
INFLUXD_CONFIG_PATH=/etc/influxdb/config.toml
|
|
||||||
|
|
||||||
function install_init {
|
|
||||||
cp -f $SCRIPT_DIR/init.sh /etc/init.d/influxdb
|
|
||||||
chmod +x /etc/init.d/influxdb
|
|
||||||
}
|
|
||||||
|
|
||||||
function install_systemd {
|
|
||||||
cp -f $SCRIPT_DIR/influxdb.service /lib/systemd/system/influxdb.service
|
|
||||||
systemctl enable influxdb
|
|
||||||
}
|
|
||||||
|
|
||||||
function install_update_rcd {
|
|
||||||
update-rc.d influxdb defaults
|
|
||||||
}
|
|
||||||
|
|
||||||
function install_chkconfig {
|
|
||||||
chkconfig --add influxdb
|
|
||||||
}
|
|
||||||
|
|
||||||
function should_upgrade {
|
|
||||||
if [[ ! -s /etc/influxdb/influxdb.conf ]]; then
|
|
||||||
# No V1 config present, no upgrade needed.
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
bolt_dir="/root/.influxdbv2 /var/lib/influxdb/.influxdbv2 /var/lib/influxdb"
|
|
||||||
for bolt in $bolt_dir; do
|
|
||||||
if [[ -s ${bolt}/influxd.bolt ]]; then
|
|
||||||
# Found a bolt file, assume previous v2 upgrade.
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
function upgrade_notice {
|
|
||||||
cat << EOF
|
|
||||||
|
|
||||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
! Important 1.x to 2.x Upgrade Notice !
|
|
||||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
Thank you for installing InfluxDB v2. Due to significant changes between
|
|
||||||
the v1 and v2 versions, upgrading to v2 requires additional steps. If
|
|
||||||
upgrading to v2 was not intended, simply re-install the v1 package now.
|
|
||||||
|
|
||||||
An upgrade helper script is available that should be reviewed and executed
|
|
||||||
prior to starting the influxdb systemd service. In order to start the v2
|
|
||||||
upgrade, execute the following:
|
|
||||||
|
|
||||||
sudo /usr/share/influxdb/influxdb2-upgrade.sh
|
|
||||||
|
|
||||||
Visit our website for complete details on the v1 to v2 upgrade process:
|
|
||||||
https://docs.influxdata.com/influxdb/latest/upgrade/v1-to-v2/
|
|
||||||
|
|
||||||
For new or upgrade installations, please review the getting started guide:
|
|
||||||
https://docs.influxdata.com/influxdb/latest/get-started/
|
|
||||||
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
function init_config {
|
|
||||||
mkdir -p $(dirname ${INFLUXD_CONFIG_PATH})
|
|
||||||
|
|
||||||
local config_path=${INFLUXD_CONFIG_PATH}
|
|
||||||
if [[ -s ${config_path} ]]; then
|
|
||||||
config_path=${INFLUXD_CONFIG_PATH}.defaults
|
|
||||||
echo "Config file ${INFLUXD_CONFIG_PATH} already exists, writing defaults to ${config_path}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
cat << EOF > ${config_path}
|
|
||||||
bolt-path = "/var/lib/influxdb/influxd.bolt"
|
|
||||||
engine-path = "/var/lib/influxdb/engine"
|
|
||||||
EOF
|
|
||||||
}
|
|
||||||
|
|
||||||
# Add defaults file, if it doesn't exist
|
|
||||||
if [[ ! -s /etc/default/influxdb2 ]]; then
|
|
||||||
cat << EOF > /etc/default/influxdb2
|
|
||||||
INFLUXD_CONFIG_PATH=${INFLUXD_CONFIG_PATH}
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove legacy symlink, if it exists
|
|
||||||
if [[ -L /etc/init.d/influxdb ]]; then
|
|
||||||
rm -f /etc/init.d/influxdb
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Distribution-specific logic
|
|
||||||
if [[ -f /etc/redhat-release ]]; then
|
|
||||||
# RHEL-variant logic
|
|
||||||
if command -v systemctl &>/dev/null; then
|
|
||||||
install_systemd
|
|
||||||
else
|
|
||||||
# Assuming sysv
|
|
||||||
install_init
|
|
||||||
install_chkconfig
|
|
||||||
fi
|
|
||||||
elif [[ -f /etc/debian_version ]]; then
|
|
||||||
# Ownership for RH-based platforms is set in build.py via the `rmp-attr` option.
|
|
||||||
# We perform ownership change only for Debian-based systems.
|
|
||||||
# Moving these lines out of this if statement would make `rmp -V` fail after installation.
|
|
||||||
chown -R -L influxdb:influxdb $LOG_DIR
|
|
||||||
chown -R -L influxdb:influxdb $DATA_DIR
|
|
||||||
chmod 755 $LOG_DIR
|
|
||||||
chmod 755 $DATA_DIR
|
|
||||||
|
|
||||||
# Debian/Ubuntu logic
|
|
||||||
if command -v systemctl &>/dev/null; then
|
|
||||||
install_systemd
|
|
||||||
else
|
|
||||||
# Assuming sysv
|
|
||||||
install_init
|
|
||||||
install_update_rcd
|
|
||||||
fi
|
|
||||||
elif [[ -f /etc/os-release ]]; then
|
|
||||||
source /etc/os-release
|
|
||||||
if [[ "$NAME" = "Amazon Linux" ]]; then
|
|
||||||
# Amazon Linux 2+ logic
|
|
||||||
install_systemd
|
|
||||||
elif [[ "$NAME" = "Amazon Linux AMI" ]]; then
|
|
||||||
# Amazon Linux logic
|
|
||||||
install_init
|
|
||||||
install_chkconfig
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check upgrade status
|
|
||||||
if should_upgrade; then
|
|
||||||
upgrade_notice
|
|
||||||
else
|
|
||||||
init_config
|
|
||||||
fi
|
|
|
@ -1,58 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
function disable_systemd {
|
|
||||||
systemctl disable influxdb
|
|
||||||
rm -f /lib/systemd/system/influxdb.service
|
|
||||||
}
|
|
||||||
|
|
||||||
function disable_update_rcd {
|
|
||||||
update-rc.d -f influxdb remove
|
|
||||||
rm -f /etc/init.d/influxdb
|
|
||||||
}
|
|
||||||
|
|
||||||
function disable_chkconfig {
|
|
||||||
chkconfig --del influxdb
|
|
||||||
rm -f /etc/init.d/influxdb
|
|
||||||
}
|
|
||||||
|
|
||||||
if [[ -f /etc/redhat-release ]]; then
|
|
||||||
# RHEL-variant logic
|
|
||||||
if [[ "$1" = "0" ]]; then
|
|
||||||
# InfluxDB is no longer installed, remove from init system
|
|
||||||
rm -f /etc/default/influxdb
|
|
||||||
|
|
||||||
if command -v systemctl &>/dev/null; then
|
|
||||||
disable_systemd
|
|
||||||
else
|
|
||||||
# Assuming sysv
|
|
||||||
disable_chkconfig
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
elif [[ -f /etc/lsb-release ]]; then
|
|
||||||
# Debian/Ubuntu logic
|
|
||||||
if [[ "$1" != "upgrade" ]]; then
|
|
||||||
# Remove/purge
|
|
||||||
rm -f /etc/default/influxdb
|
|
||||||
|
|
||||||
if command -v systemctl &>/dev/null; then
|
|
||||||
disable_systemd
|
|
||||||
else
|
|
||||||
# Assuming sysv
|
|
||||||
disable_update_rcd
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
elif [[ -f /etc/os-release ]]; then
|
|
||||||
source /etc/os-release
|
|
||||||
if [[ "$ID" = "amzn" ]] && [[ "$1" = "0" ]]; then
|
|
||||||
# InfluxDB is no longer installed, remove from init system
|
|
||||||
rm -f /etc/default/influxdb
|
|
||||||
|
|
||||||
if [[ "$NAME" = "Amazon Linux" ]]; then
|
|
||||||
# Amazon Linux 2+ logic
|
|
||||||
disable_systemd
|
|
||||||
elif [[ "$NAME" = "Amazon Linux AMI" ]]; then
|
|
||||||
# Amazon Linux logic
|
|
||||||
disable_chkconfig
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
|
@ -1,22 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
DATA_DIR=/var/lib/influxdb
|
|
||||||
USER=influxdb
|
|
||||||
GROUP=influxdb
|
|
||||||
LOG_DIR=/var/log/influxdb
|
|
||||||
|
|
||||||
if ! id influxdb &>/dev/null; then
|
|
||||||
useradd --system -U -M influxdb -s /bin/false -d $DATA_DIR
|
|
||||||
fi
|
|
||||||
|
|
||||||
# check if DATA_DIR exists
|
|
||||||
if [ ! -d "$DATA_DIR" ]; then
|
|
||||||
mkdir -p $DATA_DIR
|
|
||||||
chown $USER:$GROUP $DATA_DIR
|
|
||||||
fi
|
|
||||||
|
|
||||||
# check if LOG_DIR exists
|
|
||||||
if [ ! -d "$LOG_DIR" ]; then
|
|
||||||
mkdir -p $LOG_DIR
|
|
||||||
chown $USER:$GROUP $DATA_DIR
|
|
||||||
fi
|
|
|
@ -1,8 +0,0 @@
|
||||||
/var/log/influxdb/influxd.log {
|
|
||||||
daily
|
|
||||||
rotate 7
|
|
||||||
missingok
|
|
||||||
dateext
|
|
||||||
copytruncate
|
|
||||||
compress
|
|
||||||
}
|
|
|
@ -1 +0,0 @@
|
||||||
This prevents Git from removing this directory.
|
|
|
@ -1,30 +0,0 @@
|
||||||
#!/bin/bash -e
|
|
||||||
|
|
||||||
/usr/bin/influxd &
|
|
||||||
PID=$!
|
|
||||||
echo $PID > /var/lib/influxdb/influxd.pid
|
|
||||||
|
|
||||||
PROTOCOL="http"
|
|
||||||
BIND_ADDRESS=$(influxd print-config --key-name http-bind-address)
|
|
||||||
TLS_CERT=$(influxd print-config --key-name tls-cert | tr -d '"')
|
|
||||||
TLS_KEY=$(influxd print-config --key-name tls-key | tr -d '"')
|
|
||||||
if [ -n "${TLS_CERT}" ] && [ -n "${TLS_KEY}" ]; then
|
|
||||||
echo "TLS cert and key found -- using https"
|
|
||||||
PROTOCOL="https"
|
|
||||||
fi
|
|
||||||
HOST=${BIND_ADDRESS%:*}
|
|
||||||
HOST=${HOST:-"localhost"}
|
|
||||||
PORT=${BIND_ADDRESS##*:}
|
|
||||||
|
|
||||||
set +e
|
|
||||||
attempts=0
|
|
||||||
url="$PROTOCOL://$HOST:$PORT/ready"
|
|
||||||
result=$(curl -k -s -o /dev/null $url -w %{http_code})
|
|
||||||
while [ "${result:0:2}" != "20" ] && [ "${result:0:2}" != "40" ]; do
|
|
||||||
attempts=$(($attempts+1))
|
|
||||||
echo "InfluxDB API at $url unavailable after $attempts attempts..."
|
|
||||||
sleep 1
|
|
||||||
result=$(curl -k -s -o /dev/null $url -w %{http_code})
|
|
||||||
done
|
|
||||||
echo "InfluxDB started"
|
|
||||||
set -e
|
|
|
@ -1,27 +0,0 @@
|
||||||
# If you modify this, please also make sure to edit init.sh
|
|
||||||
|
|
||||||
[Unit]
|
|
||||||
Description=InfluxDB is an open-source, distributed, time series database
|
|
||||||
Documentation=https://docs.influxdata.com/influxdb/
|
|
||||||
After=network-online.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
User=influxdb
|
|
||||||
Group=influxdb
|
|
||||||
LimitNOFILE=65536
|
|
||||||
EnvironmentFile=-/etc/default/influxdb2
|
|
||||||
ExecStart=/usr/lib/influxdb/scripts/influxd-systemd-start.sh
|
|
||||||
KillMode=control-group
|
|
||||||
Restart=on-failure
|
|
||||||
Type=forking
|
|
||||||
PIDFile=/var/lib/influxdb/influxd.pid
|
|
||||||
StateDirectory=influxdb
|
|
||||||
StateDirectoryMode=0750
|
|
||||||
LogsDirectory=influxdb
|
|
||||||
LogsDirectoryMode=0750
|
|
||||||
UMask=0027
|
|
||||||
TimeoutStartSec=0
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
Alias=influxd.service
|
|
|
@ -1,238 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
### BEGIN INIT INFO
|
|
||||||
# Provides: influxd
|
|
||||||
# Required-Start: $all
|
|
||||||
# Required-Stop: $remote_fs $syslog
|
|
||||||
# Default-Start: 2 3 4 5
|
|
||||||
# Default-Stop: 0 1 6
|
|
||||||
# Short-Description: Start the InfluxDB process
|
|
||||||
### END INIT INFO
|
|
||||||
|
|
||||||
# If you modify this, please make sure to also edit influxdb.service
|
|
||||||
|
|
||||||
# Environment variables can be set in /etc/default/influxdb2. These will override
|
|
||||||
# any corresponding config file values.
|
|
||||||
DEFAULT=/etc/default/influxdb2
|
|
||||||
|
|
||||||
# Daemon options
|
|
||||||
INFLUXD_OPTS=
|
|
||||||
|
|
||||||
# Process name ( For display )
|
|
||||||
NAME=influxdb
|
|
||||||
|
|
||||||
# User and group
|
|
||||||
USER=influxdb
|
|
||||||
GROUP=influxdb
|
|
||||||
|
|
||||||
if [ -n "${INFLUXD_SERVICE_UMASK:-}" ]
|
|
||||||
then
|
|
||||||
umask "${INFLUXD_SERVICE_UMASK}"
|
|
||||||
else
|
|
||||||
umask 0027
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check for sudo or root privileges before continuing
|
|
||||||
if [ "$UID" != "0" ]; then
|
|
||||||
echo "You must be root to run this script"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Daemon name, where is the actual executable If the daemon is not
|
|
||||||
# there, then exit.
|
|
||||||
DAEMON=/usr/bin/influxd
|
|
||||||
if [ ! -x $DAEMON ]; then
|
|
||||||
echo "Executable $DAEMON does not exist!"
|
|
||||||
exit 5
|
|
||||||
fi
|
|
||||||
|
|
||||||
# PID file for the daemon
|
|
||||||
PIDFILE=/var/run/influxdb/influxd.pid
|
|
||||||
piddir="$(dirname "${PIDFILE}")"
|
|
||||||
if [ ! -d "${piddir}" ]; then
|
|
||||||
mkdir -p "${piddir}"
|
|
||||||
chown "${USER}:${GROUP}" "${piddir}"
|
|
||||||
chmod 0750 "${piddir}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Max open files
|
|
||||||
OPEN_FILE_LIMIT=65536
|
|
||||||
|
|
||||||
if [ -r /lib/lsb/init-functions ]; then
|
|
||||||
source /lib/lsb/init-functions
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Logging
|
|
||||||
if [ -z "$STDOUT" ]; then
|
|
||||||
STDOUT=/var/log/influxdb/influxd.log
|
|
||||||
fi
|
|
||||||
|
|
||||||
outdir="$(dirname "${STDOUT}")"
|
|
||||||
if [ ! -d "${outdir}" ]; then
|
|
||||||
mkdir -p "${outdir}"
|
|
||||||
chmod 0750 "${outdir}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$STDERR" ]; then
|
|
||||||
STDERR=/var/log/influxdb/influxd.log
|
|
||||||
fi
|
|
||||||
|
|
||||||
errdir="$(dirname "${STDERR}")"
|
|
||||||
if [ ! -d "${errdir}" ]; then
|
|
||||||
mkdir -p "${errdir}"
|
|
||||||
chmod 0750 "${errdir}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Override init script variables with DEFAULT values
|
|
||||||
if [ -r $DEFAULT ]; then
|
|
||||||
# set -a causes all variables to be auto-exported.
|
|
||||||
set -a
|
|
||||||
source $DEFAULT
|
|
||||||
set +a
|
|
||||||
fi
|
|
||||||
|
|
||||||
function log_failure_msg() {
|
|
||||||
echo "$@" "[ FAILED ]"
|
|
||||||
}
|
|
||||||
|
|
||||||
function log_success_msg() {
|
|
||||||
echo "$@" "[ OK ]"
|
|
||||||
}
|
|
||||||
|
|
||||||
function start() {
|
|
||||||
# Check that the PID file exists, and check the actual status of process
|
|
||||||
if [ -f $PIDFILE ]; then
|
|
||||||
PID="$(cat $PIDFILE)"
|
|
||||||
if kill -0 "$PID" &>/dev/null; then
|
|
||||||
# Process is already up
|
|
||||||
log_success_msg "$NAME process is already running"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
su -s /bin/sh -c "touch $PIDFILE" $USER &>/dev/null
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
log_failure_msg "$PIDFILE not writable, check permissions"
|
|
||||||
exit 5
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Bump the file limits, before launching the daemon. These will
|
|
||||||
# carry over to launched processes.
|
|
||||||
ulimit -n $OPEN_FILE_LIMIT
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
log_failure_msg "Unable to set ulimit to $OPEN_FILE_LIMIT"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Launch process
|
|
||||||
echo "Starting $NAME..."
|
|
||||||
if command -v start-stop-daemon &>/dev/null; then
|
|
||||||
start-stop-daemon \
|
|
||||||
--chuid $USER:$GROUP \
|
|
||||||
--start \
|
|
||||||
--quiet \
|
|
||||||
--pidfile $PIDFILE \
|
|
||||||
--exec $DAEMON \
|
|
||||||
-- \
|
|
||||||
$INFLUXD_OPTS >>$STDOUT 2>>$STDERR &
|
|
||||||
else
|
|
||||||
local CMD="$DAEMON $INFLUXD_OPTS >>$STDOUT 2>>$STDERR &"
|
|
||||||
su -s /bin/sh -c "$CMD" $USER
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Sleep to verify process is still up
|
|
||||||
sleep 1
|
|
||||||
echo $(pgrep -u $USER -f influxd) > $PIDFILE
|
|
||||||
if [ -f $PIDFILE ]; then
|
|
||||||
# PIDFILE exists
|
|
||||||
if kill -0 $(cat $PIDFILE) &>/dev/null; then
|
|
||||||
# PID up, service running
|
|
||||||
log_success_msg "$NAME process was started"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
log_failure_msg "$NAME process was unable to start"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
function stop() {
|
|
||||||
# Stop the daemon.
|
|
||||||
if [ -f $PIDFILE ]; then
|
|
||||||
local PID="$(cat $PIDFILE)"
|
|
||||||
if kill -0 $PID &>/dev/null; then
|
|
||||||
echo "Stopping $NAME..."
|
|
||||||
# Process still up, send SIGTERM and remove PIDFILE
|
|
||||||
kill -s TERM $PID &>/dev/null && rm -f "$PIDFILE" &>/dev/null
|
|
||||||
n=0
|
|
||||||
while true; do
|
|
||||||
# Enter loop to ensure process is stopped
|
|
||||||
kill -0 $PID &>/dev/null
|
|
||||||
if [ "$?" != "0" ]; then
|
|
||||||
# Process stopped, break from loop
|
|
||||||
log_success_msg "$NAME process was stopped"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Process still up after signal, sleep and wait
|
|
||||||
sleep 1
|
|
||||||
n=$(expr $n + 1)
|
|
||||||
if [ $n -eq 30 ]; then
|
|
||||||
# After 30 seconds, send SIGKILL
|
|
||||||
echo "Timeout exceeded, sending SIGKILL..."
|
|
||||||
kill -s KILL $PID &>/dev/null
|
|
||||||
elif [ $? -eq 40 ]; then
|
|
||||||
# After 40 seconds, error out
|
|
||||||
log_failure_msg "could not stop $NAME process"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
log_success_msg "$NAME process already stopped"
|
|
||||||
}
|
|
||||||
|
|
||||||
function restart() {
|
|
||||||
# Restart the daemon.
|
|
||||||
stop
|
|
||||||
start
|
|
||||||
}
|
|
||||||
|
|
||||||
function status() {
|
|
||||||
# Check the status of the process.
|
|
||||||
if [ -f $PIDFILE ]; then
|
|
||||||
PID="$(cat $PIDFILE)"
|
|
||||||
if kill -0 $PID &>/dev/null; then
|
|
||||||
log_success_msg "$NAME process is running"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
log_failure_msg "$NAME process is not running"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
start)
|
|
||||||
start
|
|
||||||
;;
|
|
||||||
|
|
||||||
stop)
|
|
||||||
stop
|
|
||||||
;;
|
|
||||||
|
|
||||||
restart)
|
|
||||||
restart
|
|
||||||
;;
|
|
||||||
|
|
||||||
status)
|
|
||||||
status
|
|
||||||
;;
|
|
||||||
|
|
||||||
version)
|
|
||||||
$DAEMON version
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
# For invalid arguments, print the usage message.
|
|
||||||
echo "Usage: $0 {start|stop|restart|status|version}"
|
|
||||||
exit 2
|
|
||||||
;;
|
|
||||||
esac
|
|
|
@ -1,83 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Environment defaults
|
|
||||||
INFLUXD_CONFIG_PATH=/etc/influxdb/config.toml
|
|
||||||
INFLUXD_BOLT_PATH=/var/lib/influxdb/influxd.bolt
|
|
||||||
INFLUXD_ENGINE_PATH=/var/lib/influxdb/engine
|
|
||||||
|
|
||||||
export INFLUXD_CONFIG_PATH INFLUXD_BOLT_PATH INFLUXD_ENGINE_PATH
|
|
||||||
|
|
||||||
# Check upgrade status
|
|
||||||
bolt_dir="/root/.influxdbv2 /var/lib/influxdb/.influxdbv2 /var/lib/influxdb"
|
|
||||||
for bolt in $bolt_dir
|
|
||||||
do
|
|
||||||
if [[ -s ${bolt}/influxd.bolt ]]; then
|
|
||||||
echo "An existing ${bolt}/influxd.bolt file was found indicating InfluxDB is"
|
|
||||||
echo "already upgraded to v2. Exiting."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Perform upgrade
|
|
||||||
sudo /usr/bin/influxd upgrade \
|
|
||||||
--config-file=/etc/influxdb/influxdb.conf \
|
|
||||||
--log-path=/var/log/influxdb/upgrade.log \
|
|
||||||
--continuous-query-export-path=/var/lib/influxdb/continuous_queries.txt \
|
|
||||||
--v2-config-path=${INFLUXD_CONFIG_PATH} \
|
|
||||||
-m $INFLUXD_BOLT_PATH -e $INFLUXD_ENGINE_PATH
|
|
||||||
|
|
||||||
if [[ $? -eq 0 ]]; then
|
|
||||||
|
|
||||||
cat << EOF
|
|
||||||
|
|
||||||
The upgrade completed successfully. Execute the following to start InfluxDB:
|
|
||||||
|
|
||||||
sudo systemctl start influxdb
|
|
||||||
|
|
||||||
A complete copy of v1 data was created as part of the upgrade process.
|
|
||||||
After confirming v2 is functioning as intended, removal of v1 data can be
|
|
||||||
performed by executing:
|
|
||||||
|
|
||||||
sudo /var/tmp/influxdbv1-remove.sh
|
|
||||||
|
|
||||||
NOTE: This script will erase all previous v1 data and config files!
|
|
||||||
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat << EOF > /var/tmp/influxdbv1-remove.sh
|
|
||||||
#!/bin/bash
|
|
||||||
sudo rm -f /etc/influxdb/influxdb.conf
|
|
||||||
sudo rm -rf /var/lib/influxdb/data
|
|
||||||
sudo rm -rf /var/lib/influxdb/wal
|
|
||||||
sudo rm -rf /var/lib/influxdb/meta
|
|
||||||
EOF
|
|
||||||
sudo chmod +x /var/tmp/influxdbv1-remove.sh
|
|
||||||
|
|
||||||
sudo cp /root/.influxdbv2/configs /var/lib/influxdb
|
|
||||||
sudo chown influxdb:influxdb /var/lib/influxdb/influxd.bolt /var/lib/influxdb/configs
|
|
||||||
sudo chown -R influxdb:influxdb /var/lib/influxdb/engine
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
cat << EOF
|
|
||||||
|
|
||||||
The upgrade encountered an error. Please review the
|
|
||||||
/var/log/influxdb/upgrade.log file for more information. Before attempting
|
|
||||||
another upgrade, removal of v2 data should be performed by executing:
|
|
||||||
|
|
||||||
sudo /var/tmp/influxdbv2-remove.sh
|
|
||||||
|
|
||||||
NOTE: This script will erase all previous v2 data and config files!
|
|
||||||
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat << EOF > /var/tmp/influxdbv2-remove.sh
|
|
||||||
#!/bin/bash
|
|
||||||
sudo rm -f /etc/influxdb/config.toml /var/lib/influxdb/influxd.bolt
|
|
||||||
sudo rm -f /var/lib/influxdb/configs /root/.influxdbv2/configs
|
|
||||||
sudo rm -f /var/lib/influxdb/continuous_queries.txt
|
|
||||||
sudo rm -rf /var/lib/influxdb/engine
|
|
||||||
EOF
|
|
||||||
sudo chmod +x /var/tmp/influxdbv2-remove.sh
|
|
||||||
|
|
||||||
fi
|
|
|
@ -1,2 +0,0 @@
|
||||||
PyYAML==6.0
|
|
||||||
regex==2023.6.3
|
|
Loading…
Reference in New Issue