Blame
Date:
Tue Dec 21 06:15:21 2021 UTC
Message:
Import sources
001
2021-12-21
jrmu
#!/usr/bin/perl
002
2021-12-21
jrmu
003
2021-12-21
jrmu
use strict;
004
2021-12-21
jrmu
use warnings;
005
2021-12-21
jrmu
use OpenBSD::Pledge;
006
2021-12-21
jrmu
use OpenBSD::Unveil;
007
2021-12-21
jrmu
use Data::Dumper;
008
2021-12-21
jrmu
use File::Copy qw(copy);
009
2021-12-21
jrmu
010
2021-12-21
jrmu
my $vmconf = "/etc/vm.conf";
011
2021-12-21
jrmu
my $zonedir = "/var/nsd/zones/master/";
012
2021-12-21
jrmu
my $hostname = "host.oddprotocol.org";
013
2021-12-21
jrmu
my $ipv4path = "/home/error/ipv4s";
014
2021-12-21
jrmu
my @ipv4s;
015
2021-12-21
jrmu
if (!(-s "$ipv4path")) {
016
2021-12-21
jrmu
print "No IPv4 addresses in $ipv4path!\n";
017
2021-12-21
jrmu
die;
018
2021-12-21
jrmu
} else {
019
2021-12-21
jrmu
@ipv4s = readarray($ipv4path);
020
2021-12-21
jrmu
}
021
2021-12-21
jrmu
022
2021-12-21
jrmu
`doas chmod -R g+w $zonedir`;
023
2021-12-21
jrmu
024
2021-12-21
jrmu
# Read from filename and return array of lines without trailing newlines
025
2021-12-21
jrmu
sub readarray {
026
2021-12-21
jrmu
my ($filename) = @_;
027
2021-12-21
jrmu
open(my $fh, '<', $filename) or die "Could not read file '$filename' $!";
028
2021-12-21
jrmu
chomp(my @lines = <$fh>);
029
2021-12-21
jrmu
close $fh;
030
2021-12-21
jrmu
return @lines;
031
2021-12-21
jrmu
}
032
2021-12-21
jrmu
033
2021-12-21
jrmu
# Read from filename and return as string
034
2021-12-21
jrmu
sub readstr {
035
2021-12-21
jrmu
my ($filename) = @_;
036
2021-12-21
jrmu
open my $fh, '<', $filename or die "Could not read file '$filename' $!";
037
2021-12-21
jrmu
my $str = do { local $/; <$fh> };
038
2021-12-21
jrmu
close $fh;
039
2021-12-21
jrmu
return $str;
040
2021-12-21
jrmu
}
041
2021-12-21
jrmu
042
2021-12-21
jrmu
# Write str to filename
043
2021-12-21
jrmu
sub writefile {
044
2021-12-21
jrmu
my ($filename, $str) = @_;
045
2021-12-21
jrmu
open(my $fh, '>', "$filename") or die "Could not write to $filename";
046
2021-12-21
jrmu
print $fh $str;
047
2021-12-21
jrmu
close $fh;
048
2021-12-21
jrmu
}
049
2021-12-21
jrmu
050
2021-12-21
jrmu
# Append str to filename
051
2021-12-21
jrmu
sub appendfile {
052
2021-12-21
jrmu
my ($filename, $str) = @_;
053
2021-12-21
jrmu
open(my $fh, '>>', "$filename") or die "Could not append to $filename";
054
2021-12-21
jrmu
print $fh $str;
055
2021-12-21
jrmu
close $fh;
056
2021-12-21
jrmu
}
057
2021-12-21
jrmu
058
2021-12-21
jrmu
sub date {
059
2021-12-21
jrmu
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
060
2021-12-21
jrmu
my $localtime = sprintf("%04d%02d%02d", $year+1900, $mon+1, $mday);
061
2021-12-21
jrmu
return $localtime;
062
2021-12-21
jrmu
}
063
2021-12-21
jrmu
064
2021-12-21
jrmu
sub setdns {
065
2021-12-21
jrmu
my ($domain, $ip) = @_;
066
2021-12-21
jrmu
my $filename = "$zonedir/$hostname";
067
2021-12-21
jrmu
my $subdomain;
068
2021-12-21
jrmu
if ($domain =~ /^([a-zA-Z][-\.a-zA-Z0-9]+)\.$hostname$/) {
069
2021-12-21
jrmu
$subdomain = $1;
070
2021-12-21
jrmu
} else {
071
2021-12-21
jrmu
return 0;
072
2021-12-21
jrmu
}
073
2021-12-21
jrmu
my @lines = readarray($filename);
074
2021-12-21
jrmu
foreach my $line (@lines) {
075
2021-12-21
jrmu
# increment the zone's serial number
076
2021-12-21
jrmu
if ($line =~ /(\d{8})(\d{2})((\s+\d+){4}\s*\))/) {
077
2021-12-21
jrmu
my $date = date();
078
2021-12-21
jrmu
my $serial = 0;
079
2021-12-21
jrmu
if ($date <= $1) { $serial = $2+1; }
080
2021-12-21
jrmu
$line = $`.$date.sprintf("%02d",$serial).$3.$';
081
2021-12-21
jrmu
}
082
2021-12-21
jrmu
}
083
2021-12-21
jrmu
if ($ip =~ /^([0-9\.]+)$/) { # if IPv4
084
2021-12-21
jrmu
push(@lines, "$subdomain 3600 IN A $ip");
085
2021-12-21
jrmu
} elsif ($ip =~ /:/) { # if IPv6
086
2021-12-21
jrmu
push(@lines, "$subdomain 3600 IN AAAA $ip");
087
2021-12-21
jrmu
} elsif (!defined($ip)) { # delete records
088
2021-12-21
jrmu
@lines = grep !/\b$subdomain\s*3600\s*IN/, @lines;
089
2021-12-21
jrmu
}
090
2021-12-21
jrmu
# trailing newline necessary
091
2021-12-21
jrmu
writefile("$filename.bak", join("\n", @lines)."\n");
092
2021-12-21
jrmu
copy "$filename.bak", $filename;
093
2021-12-21
jrmu
if (system("doas -u _nsd nsd-control reload")) {
094
2021-12-21
jrmu
return 0;
095
2021-12-21
jrmu
} else {
096
2021-12-21
jrmu
return 1;
097
2021-12-21
jrmu
}
098
2021-12-21
jrmu
}
099
2021-12-21
jrmu
100
2021-12-21
jrmu
# create A and AAAA records for subdomain, set the rDNS,
101
2021-12-21
jrmu
# and return the new ipv6 address
102
2021-12-21
jrmu
sub nextdns {
103
2021-12-21
jrmu
my ($subdomain) = @_;
104
2021-12-21
jrmu
my $ipv4 = shift(@ipv4s);
105
2021-12-21
jrmu
my $ipv6;
106
2021-12-21
jrmu
my $fqdn = "$subdomain.$hostname";
107
2021-12-21
jrmu
if ($ipv4 =~ /^[0-9]+\.[0-9]+\.[0-9]+\.([0-9]+)$/) {
108
2021-12-21
jrmu
$ipv6 = "2602:fccf:1:1".sprintf("%03d",$1)."::";
109
2021-12-21
jrmu
}
110
2021-12-21
jrmu
writefile($ipv4path, join("\n", @ipv4s));
111
2021-12-21
jrmu
my $success = setdns($fqdn, $ipv4) && setdns($fqdn, $ipv6) && setdns("ns1.$fqdn", $ipv4) && setdns("ns2.$fqdn", $ipv4);
112
2021-12-21
jrmu
return $success;
113
2021-12-21
jrmu
}
114
2021-12-21
jrmu
115
2021-12-21
jrmu
sub createshell {
116
2021-12-21
jrmu
my ($username, $password) = @_;
117
2021-12-21
jrmu
print "Username: $username\n";
118
2021-12-21
jrmu
print "Password: $password\n";
119
2021-12-21
jrmu
system "doas groupadd $username";
120
2021-12-21
jrmu
system "doas adduser -batch $username $username $username `encrypt $password`";
121
2021-12-21
jrmu
system "doas usermod -G vmdusers $username";
122
2021-12-21
jrmu
system "doas chmod -R o-rwx /home/$username";
123
2021-12-21
jrmu
system "doas su -l $username -c \"vmctl create -s 20G $username.qcow2\"";
124
2021-12-21
jrmu
print "VM created for $username!\n";
125
2021-12-21
jrmu
my @vmconf = readarray($vmconf);
126
2021-12-21
jrmu
my $lladdr;
127
2021-12-21
jrmu
foreach my $line (@vmconf) {
128
2021-12-21
jrmu
if ($line =~ /lladdr (.*)/) {
129
2021-12-21
jrmu
$lladdr = $1;
130
2021-12-21
jrmu
}
131
2021-12-21
jrmu
}
132
2021-12-21
jrmu
if (defined($lladdr) && $lladdr =~ /([0-9a-fA-F]{2})$/) {
133
2021-12-21
jrmu
$lladdr = $`.($1+1);
134
2021-12-21
jrmu
}
135
2021-12-21
jrmu
my $block = <<"EOF";
136
2021-12-21
jrmu
vm "$username" {
137
2021-12-21
jrmu
owner $username
138
2021-12-21
jrmu
memory 1024M
139
2021-12-21
jrmu
cdrom "/home/iso/install70.iso"
140
2021-12-21
jrmu
disk /home/$username/$username.qcow2
141
2021-12-21
jrmu
interface {
142
2021-12-21
jrmu
locked lladdr $lladdr
143
2021-12-21
jrmu
switch "switch0"
144
2021-12-21
jrmu
}
145
2021-12-21
jrmu
}
146
2021-12-21
jrmu
EOF
147
2021-12-21
jrmu
appendfile($vmconf, $block);
148
2021-12-21
jrmu
`doas vmctl reload`;
149
2021-12-21
jrmu
}
150
2021-12-21
jrmu
151
2021-12-21
jrmu
my $nargs = $#ARGV + 1;
152
2021-12-21
jrmu
if ($nargs != 1) {
153
2021-12-21
jrmu
print "\nUsage: install.pl username\n";
154
2021-12-21
jrmu
exit;
155
2021-12-21
jrmu
}
156
2021-12-21
jrmu
my $username = $ARGV[0];
157
2021-12-21
jrmu
my $password = join'', map +(0..9,'a'..'z','A'..'Z')[rand(10+26*2)], 1..12;
158
2021-12-21
jrmu
159
2021-12-21
jrmu
createshell($username, $password);
160
2021-12-21
jrmu
nextdns($username);
IRCNow