summaryrefslogtreecommitdiffstats
path: root/pkgs/tools/nix/info/info.sh
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/tools/nix/info/info.sh')
-rwxr-xr-xpkgs/tools/nix/info/info.sh169
1 files changed, 169 insertions, 0 deletions
diff --git a/pkgs/tools/nix/info/info.sh b/pkgs/tools/nix/info/info.sh
new file mode 100755
index 000000000000..473e035b8e0a
--- /dev/null
+++ b/pkgs/tools/nix/info/info.sh
@@ -0,0 +1,169 @@
+#!/bin/bash
+
+PATH="@path@:$PATH"
+IS_DARWIN="@is_darwin@"
+
+set -eu
+set -o pipefail
+
+DEBUG=0
+MARKDOWN=0
+HOST_OS=0
+SANDBOX=0
+while true; do
+ case "${1:-}" in
+ "")
+ break
+ ;;
+ -d | --debug)
+ set -x
+ DEBUG=1
+ shift
+ ;;
+ -m | --markdown)
+ MARKDOWN=1
+ HOST_OS=1
+ SANDBOX=1
+ shift
+ ;;
+ --host-os)
+ HOST_OS=1
+ shift
+ ;;
+ --sandbox)
+ SANDBOX=1
+ shift
+ ;;
+
+ * )
+ cat <<EOF
+nix-info - get high level info to help with debugging
+
+Options:
+
+ -m, --markdown formatting for a GitHub issue
+ implies: --host-os, --sandbox
+
+ --sandbox include sandbox configuration
+ --host-os include host OS details
+
+ -h, --help show this message
+ -d, --debug debug mode
+
+EOF
+ exit 1
+ ;;
+
+ esac
+done
+
+debuglog() {
+ if [ $DEBUG -eq 1 ]; then
+ cat >&2
+ else
+ cat > /dev/null
+ fi
+}
+
+nixev() {
+ nix-instantiate --eval --strict -E "$1"
+}
+
+desc_system() {
+ nixev '(import <nixpkgs> {}).system'
+}
+
+desc_host_os() {
+ printf "%s" "$(uname -sr)"
+
+ if [ "$IS_DARWIN" = "yes" ]; then
+ printf ", macOS %s" "$(sw_vers -productVersion)"
+ fi
+
+ if [ -f /etc/os-release ]; then
+ (
+ # shellcheck disable=SC1091
+ . /etc/os-release
+ printf ", %s, %s" "${NAME:-$(uname -v)}" "${VERSION:-noversion}"
+ )
+ fi
+}
+
+desc_multi_user() {
+ if nix-build --no-out-link @multiusertest@ 2>&1 | debuglog; then
+ printf "yes"
+ else
+ printf "no"
+ fi
+}
+
+desc_nixpkgs_path() {
+ nixev '<nixpkgs>'
+}
+
+channel_facts() {
+ find /nix/var/nix/profiles/per-user \
+ -mindepth 2 \
+ -maxdepth 2 \
+ -name channels \
+ -print0 \
+ |\
+ while IFS= read -r -d '' userchannelset; do
+ manifest="$userchannelset/manifest.nix"
+
+ if [ -e "$manifest" ]; then
+ userchannels=$(nixev \
+ "builtins.concatStringsSep \", \"
+ (map (ch: ch.name)
+ (import \"$manifest\"))")
+
+ fact "channels($(echo "$manifest" | cut -d/ -f7))" \
+ "$userchannels"
+ fi
+ done
+}
+
+desc_sandbox() {
+ if nix-build --no-out-link @sandboxtest@ 2>&1 | debuglog; then
+ printf "no"
+ elif nix-build --no-out-link @relaxedsandboxtest@ 2>&1 | debuglog; then
+ printf "relaxed"
+ else
+ printf "yes"
+ fi
+}
+
+fact() {
+ name="${1:-0}"
+ value="${2:-0}"
+ last="${3:-1}"
+ if [ $MARKDOWN -eq 0 ]; then
+ printf "%s: %s" "$name" "$value"
+ if [ "$last" -eq 1 ]; then
+ printf ", "
+ fi
+ else
+ printf " - %s: \`%s\`\n" "$name" "$value"
+ fi
+
+ if [ "$last" -eq 0 ]; then
+ echo ""
+ fi
+}
+
+last_fact() {
+ fact "$1" "$2" 0
+}
+
+fact "system" "$(desc_system)"
+if [ $HOST_OS -eq 1 ]; then
+ fact "host os" "$(desc_host_os)"
+fi
+fact "multi-user?" "$(desc_multi_user)"
+if [ $SANDBOX -eq 1 ]; then
+ fact "sandbox" "$(desc_sandbox)"
+fi
+
+fact "version" "$(nix-env --version)"
+channel_facts
+last_fact "nixpkgs" "$(desc_nixpkgs_path)"