| @ -1 +1,3 @@ | |||
| packer_cache/ | |||
| packer_cache/ | |||
| output/ | |||
| *.retry | |||
| @ -0,0 +1,18 @@ | |||
| ROOT_PASSWORD=uuunifi | |||
| OUTPUT_IMAGE=$(shell find output/base -type f -name '*.ova' | head -1) | |||
| all: output/unifi/ | |||
| output/base/: | |||
| packer build -var root_password=$(ROOT_PASSWORD) packer/base.json | |||
| output/unifi/: output/base/ | |||
| packer build -var root_password=$(ROOT_PASSWORD) \ | |||
| -var source_image=$(OUTPUT_IMAGE) packer/provision.json | |||
| clean: clean_base clean_provisioned | |||
| clean_base: | |||
| rm -r output/base | |||
| clean_provisioned: | |||
| rm -r output/unifi | |||
| .PHONY: all clean | |||
| @ -1,64 +0,0 @@ | |||
| { | |||
| "variables": { | |||
| "memory": "4G", | |||
| "cpus": "2", | |||
| "iso_url": "https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-9.8.0-amd64-netinst.iso", | |||
| "iso_checksum": "cc4a6bd50925c1c4af98049060e304494bc9da61eb5eb272c556d67608de14d4e6a4b8bc1c9412a0f810083912e228569f3771ffffa7174538f3e26f45a05245", | |||
| "iso_checksum_type": "sha512", | |||
| "boot_wait": "3s", | |||
| "boot_key_interval": "10ms", | |||
| "ssh_username": "unifi", | |||
| "ssh_password": "uuunifi", | |||
| "ssh_timeout": "60m", | |||
| "machine_hostname": "unifi-controller", | |||
| "machine_domain": "lab.uncomfortably.online", | |||
| "http_directory": "http/", | |||
| "preseed_file": "preseed.cfg" | |||
| }, | |||
| "builders": [ | |||
| { | |||
| "type": "qemu", | |||
| "accelerator": "kvm", | |||
| "qemuargs": [ | |||
| [ "-m", "{{ user `memory` }}" ], | |||
| [ "-smp", "cpus={{ user `cpus`}}"] | |||
| ], | |||
| "iso_url": "{{user `iso_url`}}", | |||
| "iso_checksum": "{{user `iso_checksum`}}", | |||
| "iso_checksum_type": "{{user `iso_checksum_type`}}", | |||
| "http_directory": "{{user `http_directory`}}", | |||
| "boot_wait": "{{user `boot_wait`}}", | |||
| "boot_key_interval": "{{user `boot_key_interval`}}", | |||
| "boot_command": [ | |||
| "<esc><wait>", | |||
| "install ", | |||
| "auto=true ", | |||
| "url=http://{{.HTTPIP}}:{{.HTTPPort}}/{{user `preseed_file`}} ", | |||
| "hostname={{user `machine_hostname`}} ", | |||
| "domain={{user `machine_domain`}} ", | |||
| "interface=auto ", | |||
| "passwd/user-fullname={{user `ssh_username`}} ", | |||
| "passwd/username={{user `ssh_username`}} ", | |||
| "passwd/user-password={{user `ssh_password`}} ", | |||
| "passwd/user-password-again={{user `ssh_password`}} ", | |||
| "<enter>" | |||
| ], | |||
| "communicator": "ssh", | |||
| "ssh_username": "{{user `ssh_username`}}", | |||
| "ssh_password": "{{user `ssh_password`}}", | |||
| "ssh_timeout": "{{user `ssh_timeout`}}" | |||
| } | |||
| ] | |||
| } | |||
| @ -0,0 +1,19 @@ | |||
| KEYMAPOPTS="us us" | |||
| HOSTNAMEOPTS="-n :hostname:" | |||
| INTERFACESOPTS="auto lo | |||
| iface lo inet loopback | |||
| auto eth0 | |||
| iface eth0 inet dhcp | |||
| hostname :hostname:" | |||
| DNSOPTS="-d 8.8.8.8" | |||
| TIMEZONEOPTS="-z UTC" | |||
| PROXYOPTS="none" | |||
| APKREPOSOPTS="-1" | |||
| SSHDOPTS="-c openssh" | |||
| NTPOPTS="-c chrony" | |||
| DISKOPTS="-m sys /dev/sda" | |||
| @ -1,62 +0,0 @@ | |||
| ### Localization | |||
| # Preseeding only locale sets language, country and locale. | |||
| d-i debian-installer/locale string en_US | |||
| # Keyboard selection. | |||
| d-i keyboard-configuration/xkb-keymap select us | |||
| ### Network configuration | |||
| # netcfg will choose an interface that has link if possible. This makes it | |||
| # skip displaying a list if there is more than one interface. | |||
| d-i netcfg/choose_interface select auto | |||
| # Disable that annoying WEP key dialog. | |||
| d-i netcfg/wireless_wep string | |||
| ### Mirror settings | |||
| d-i mirror/country string manual | |||
| d-i mirror/http/hostname string http.us.debian.org | |||
| d-i mirror/http/directory string /debian | |||
| d-i mirror/http/proxy string | |||
| ### Account setup | |||
| # Skip creation of a root account (normal user account will be able to | |||
| # use sudo). | |||
| d-i passwd/root-login boolean false | |||
| ## Package setup | |||
| d-i hw-detect/load_firmware boolean false | |||
| d-i hw-detect/load_media boolean false | |||
| apt-cdrom-setup apt-setup/cdrom/set-first boolean false | |||
| tasksel tasksel/first multiselect print-server, ssh-server, standard | |||
| d-i pkgsel/include string sudo, unattended-upgrades | |||
| popularity-contest popularity-contest/participate boolean false | |||
| ### Clock and time zone setup | |||
| d-i clock-setup/utc boolean true | |||
| d-i time/zone string UTC | |||
| d-i clock-setup/ntp boolean true | |||
| ### Partitioning | |||
| d-i partman-auto/method string lvm | |||
| d-i partman-lvm/device_remove_lvm boolean true | |||
| d-i partman-md/device_remove_md boolean true | |||
| d-i partman-lvm/confirm boolean true | |||
| d-i partman-lvm/confirm_nooverwrite boolean true | |||
| d-i partman-auto/choose_recipe select atomic | |||
| d-i partman-partitioning/confirm_write_new_label boolean true | |||
| d-i partman/choose_partition select finish | |||
| d-i partman/confirm boolean true | |||
| d-i partman/confirm_nooverwrite boolean true | |||
| # This makes partman automatically partition without confirmation. | |||
| d-i partman-md/confirm boolean true | |||
| d-i partman-partitioning/confirm_write_new_label boolean true | |||
| d-i partman/choose_partition select finish | |||
| d-i partman/confirm boolean true | |||
| d-i partman/confirm_nooverwrite boolean true | |||
| ### Boot loader installation | |||
| d-i grub-installer/only_debian boolean true | |||
| d-i grub-installer/with_other_os boolean true | |||
| d-i finish-install/reboot_in_progress note | |||
| @ -0,0 +1,66 @@ | |||
| { | |||
| "variables": { | |||
| "iso_url": "http://dl-cdn.alpinelinux.org/alpine/v3.9/releases/x86_64/alpine-standard-3.9.3-x86_64.iso", | |||
| "iso_checksum": "6e28c5c902ccb6db24596dfb6a1c255c7989d0b9be4e92e87a8eff523201a459", | |||
| "iso_checksum_type": "sha256", | |||
| "boot_wait": "10s", | |||
| "root_password": null, | |||
| "ssh_timeout": "60m", | |||
| "machine_hostname": "unifi", | |||
| "http_directory": "http/", | |||
| "output_directory": "output/base/" | |||
| }, | |||
| "builders": [ | |||
| { | |||
| "type": "virtualbox-iso", | |||
| "guest_os_type": "Linux_64", | |||
| "format": "ova", | |||
| "iso_url": "{{user `iso_url`}}", | |||
| "iso_checksum": "{{user `iso_checksum`}}", | |||
| "iso_checksum_type": "{{user `iso_checksum_type`}}", | |||
| "http_directory": "{{user `http_directory`}}", | |||
| "output_directory": "{{user `output_directory`}}", | |||
| "boot_wait": "{{user `boot_wait`}}", | |||
| "boot_command": [ | |||
| "root<enter><wait>", | |||
| "ifconfig eth0 up && ", | |||
| "udhcpc -i eth0<enter>", | |||
| "<wait5>", | |||
| "wget http://{{ .HTTPIP }}:{{ .HTTPPort }}/answers<enter><wait>", | |||
| "sed -i ", | |||
| "-e \"s/:hostname:/{{user `machine_hostname`}}/g\" ", | |||
| "answers<enter>", | |||
| "sed -i \"s/rc-service \\$svc start/#&/\" /sbin/setup-sshd<enter>", | |||
| "setup-alpine -f answers && ", | |||
| "mount /dev/sda3 /mnt && ", | |||
| "echo 'PermitRootLogin yes' >> /mnt/etc/ssh/sshd_config && ", | |||
| "rc-update add acpid && ", | |||
| "umount /mnt && ", | |||
| "reboot", | |||
| "<enter>", | |||
| "<wait5>", | |||
| "{{user `root_password`}}<enter><wait>", | |||
| "{{user `root_password`}}<enter><wait20>", | |||
| "y<enter>" | |||
| ], | |||
| "communicator": "ssh", | |||
| "ssh_username": "root", | |||
| "ssh_password": "{{user `root_password`}}", | |||
| "ssh_timeout": "{{user `ssh_timeout`}}" | |||
| } | |||
| ] | |||
| } | |||
| @ -0,0 +1,42 @@ | |||
| { | |||
| "variables": { | |||
| "source_image": null, | |||
| "root_password": null, | |||
| "boot_wait": "10s", | |||
| "output_directory": "output/unifi/" | |||
| }, | |||
| "builders": [ | |||
| { | |||
| "type": "virtualbox-ovf", | |||
| "format": "ova", | |||
| "source_path": "{{user `source_image`}}", | |||
| "checksum_type": "none", | |||
| "output_directory": "{{user `output_directory`}}", | |||
| "boot_wait": "{{user `boot_wait`}}", | |||
| "shutdown_command": "echo '{{user `root_password`}}' | sudo -S poweroff", | |||
| "communicator": "ssh", | |||
| "ssh_username": "root", | |||
| "ssh_password": "{{user `root_password`}}" | |||
| } | |||
| ], | |||
| "provisioners": [ | |||
| { | |||
| "type": "shell", | |||
| "inline": [ | |||
| "apk update", | |||
| "apk add python sudo" | |||
| ] | |||
| }, | |||
| { | |||
| "type": "ansible", | |||
| "extra_arguments": [], | |||
| "user": "root", | |||
| "playbook_file": "./provisioning/setup.yml" | |||
| } | |||
| ] | |||
| } | |||
| @ -0,0 +1,69 @@ | |||
| - hosts: default | |||
| debugger: on_failed | |||
| vars: | |||
| unifi_software_url: https://dl.ubnt.com/unifi/5.10.21/UniFi.unix.zip | |||
| tasks: | |||
| - replace: | |||
| path: /etc/apk/repositories | |||
| regexp: '^#(.*v\d+.\d+/community.*)$' | |||
| replace: '\1' | |||
| - apk: | |||
| name: openjdk8-jre | |||
| state: present | |||
| update_cache: yes | |||
| - apk: | |||
| name: '{{item}}' | |||
| state: present | |||
| loop: | |||
| - shadow | |||
| - mongodb | |||
| - s6 | |||
| - unzip | |||
| - user: | |||
| name: unifi | |||
| home: /srv/unifi | |||
| - get_url: | |||
| url: '{{unifi_software_url}}' | |||
| dest: /tmp/UniFi.unix.zip | |||
| - command: unzip /tmp/UniFi.unix.zip | |||
| args: | |||
| chdir: /tmp | |||
| warn: false | |||
| - shell: mv /tmp/UniFi/* /srv/unifi | |||
| - command: rm /srv/unifi/bin/mongod | |||
| - file: | |||
| path: /srv/unifi | |||
| owner: unifi | |||
| mode: o-rwx | |||
| recurse: yes | |||
| - file: | |||
| dest: /srv/unifi/bin/mongod | |||
| src: /usr/bin/mongod | |||
| state: link | |||
| - file: | |||
| path: /etc/unifi/log | |||
| state: directory | |||
| - template: | |||
| src: templates/unifi/run | |||
| dest: /etc/unifi/run | |||
| mode: 755 | |||
| - template: | |||
| src: templates/unifi/log/run | |||
| dest: /etc/unifi/log/run | |||
| mode: 755 | |||
| - user: | |||
| name: log | |||
| home: /var/log | |||
| - file: | |||
| path: /var/log/unifi | |||
| state: directory | |||
| owner: log | |||
| mode: 750 | |||
| - template: | |||
| src: templates/init.d/unifi | |||
| dest: /etc/init.d/unifi | |||
| mode: 755 | |||
| - service: | |||
| name: unifi | |||
| state: started | |||
| enabled: yes | |||
| @ -0,0 +1,16 @@ | |||
| #!/sbin/openrc-run | |||
| name="unifi" | |||
| supervisor=s6 | |||
| s6_service_path="${RC_SVCDIR}/s6-scan/${name}" | |||
| depend() { | |||
| need net s6-svscan | |||
| after firewall | |||
| } | |||
| start_pre() { | |||
| if [ ! -L "${RC_SVCDIR}/s6-scan/${name}" ]; then | |||
| ln -s "/etc/${name}" "${RC_SVCDIR}/s6-scan/${name}" | |||
| fi | |||
| } | |||
| @ -0,0 +1,5 @@ | |||
| #!/bin/ash | |||
| log_user='log' | |||
| exec s6-setuidgid $log_user s6-log -b n20 s1000000 t /var/log/unifi | |||
| @ -0,0 +1,19 @@ | |||
| #!/bin/ash | |||
| user='unifi' | |||
| group='unifi' | |||
| exec 2>&1 | |||
| base='/srv/unifi' | |||
| if [ -d $base ]; then | |||
| cd $base | |||
| chown -R $user:$group . | |||
| version=`head -1 webapps/ROOT/app-unifi/.version` | |||
| echo "Starting UniFi Controller $version" | |||
| exec s6-setuidgid $user java -jar lib/ace.jar start | |||
| else | |||
| echo "Missing $base ... aborting" | |||
| touch down | |||
| fi | |||