#!/usr/bin/perl

use strict;
use warnings;

system("touch /etc/systemd/dont-synthesize-nobody") if -d "/etc/systemd";
my $uid = getpwnam("nobody");
my $gid = getgrnam("nobody");
my @ids = ( 65534, 99 );

my $user_needs_informed = 0;

if ( !defined $gid ) {
    $user_needs_informed = 1;

    my $addgroup = -x '/usr/sbin/groupadd' ? "groupadd" : "addgroup";
    for my $id (@ids) {
        system("$addgroup --system --gid $id nobody");
        $gid = getgrnam("nobody");
        last if defined $gid;
    }

    if ( !defined $gid ) {
        system("$addgroup --system nobody");
    }

    $gid = getgrnam("nobody");
    die "Could not ensure `nobody` group\n" if !defined $gid;
}

if ( !defined $uid ) {
    $user_needs_informed = 1;

    my $flags = -x '/usr/sbin/groupadd' ? "" : "--disabled-password --disabled-login";
    for my $id (@ids) {
        system("adduser --system --uid $id --gid $gid --home / --no-create-home --shell /sbin/nologin $flags nobody");
        $uid = getpwnam("nobody");
        last if defined $uid;
    }

    if ( !defined $uid ) {
        system("adduser --system --gid $gid --home / --no-create-home --shell /sbin/nologin $flags nobody");
    }

    $uid = getpwnam("nobody");
    die "Could not ensure `nobody` user\n" if !defined $uid;
}

# if already done, its a noop. adduser’s --gid does not make this happen
system("usermod -G $gid -a nobody");

print "[INFO] `nobody` user created with UID $uid and GID $gid\n" if $user_needs_informed;
