2021-06-15-Install-thttpd-Pi-400-ubuntu-21.04-desktop-arm64+raspi.txt Once the Acme.com thttpd pages have been copied, most of the commands can be copied and pasted to a terminal. A few things will need to be changed but most will be: copy, paste, enter. WWW pages for EVERYONE!!! ************* How much HTML do I have to know to set up a web page? NONE! The thttpd web server, without any HTML, can make a quick and dirty website which looks like a directory listing. The priority is FUNCTION and GLITZ can come later! If you get banned by Google, Facebook, YouTube or whoever, you can be back live in minutes! When a file is put into "public_html" it is live! These instructions may seem long with a lot of unnecessary text, but I want even a third or fourth grader who has never compiled a program to be able to go through the process without any trouble. If they do have trouble, with enough documentation to be able to see where they went wrong and be able to correct the problem. This project should be the beginning for a live stable website directly connected to the Internet, whether connected dynamically or statically, and as a basis for website design. The initial file for a web page is "index.html" although thttpd will recognize INDEX_NAMES: "index.html", "index.htm", "index.xhtml", "index.xht", "Default.htm", and "index.cgi", for initial web page file names. If no index file is found, thttpd will automatically generate its own index which results in a green screen and a directory listing. For starters, one should probably choose a microSD card that has a U3 rating (100MB/s Read speed, and 50MB/s Write speed) over a U1 card (100 MB/s Read speed, and 10 MB/s Write speed). I have been using WalMart "keep onn" cards which work OK. One 128GB microSDXC U3 Card with Adapter runs $17.94, One 64GB microSDXC U3 Card with adapter runs $11.24, while two 32GB microSDHC U1 Cards with Adapter runs $11.94. At present, my website, http://162.250.19.7/ is running on a Raspberry Pi 4B with 4GB RAM and a 32GB U1 card using 32 bit Raspian which runs OK. My biggest problem is losing power since I live out in my field and have to run batteries and an inverter for my power. If my voltage goes too high it drops out and if it goes too low it drops out. My internet connection is from https://RiverCanyonWireless.com/ and is $30 a month with an extra $5 for a static IP Address, with a download speed of 2Mbits/sec and an upload speed of 1Mbits/sec. thttpd will serve files up to 2GB and if they are over that they just don't show up. Downloading "Ubuntu 21.04 Desktop 64bit" at 1.6GB took 2 hours. A 2GB file uploading would take up all of my bandwidth for at least 5 hours! Smaller files work a lot better! thttpd is a bullet proof World Wide Web HTTP server which used to be the number seven most popular web server. One can safely post things for the "World to See" since out of the box thttpd has a read only file structure. My site has been up for almost 2 years with no problems, and I had no problems when I ran an earlier version back in 2005. Some of my earlier sites are under "www/" and are not that great, but making a website with HTML is a learning process. As one can see from my site, the idea is to share information with someone across the world, (Function) and worry about the (Glitz) that can come with experience. If one would like to see what kind of hammering a www site gets they can look at my log files under "ac0xl/" and then "logs/" which I have been posting manually. Using "whois" and typing in their IP Address, (sudo apt install whois), one can get an idea of where someone was coming from when they looked at your site. I really liked the use of an anvil for an icon since it denotes the ability to be hammered on without breaking! If one is going to use a microSD card that is larger than 32GB one HAS to erase it first with rpi-imager (To install on Raspberry Pi OS, type: "sudo apt install rpi-imager", in a Terminal window.) The message I got back was: No apt package "rpi-imager", but there is a snap with that name. Try "snap install rpi-imager" which did actually work! Under Operating System, choose "ERASE, Format card as FAT32", since the loader will only handle a FAT32 file system, and then after it loads it will replace all of that with a FAT32 boot partition and a regular 83 linux ext4 rootfs partition. The next step is to copy the 64 bit Ubuntu Desktop OS onto the microSD card. It really helps to have a USB card reader dongle to be able to write to SD and microSD cards! After the card is written it is time to shut down and power off, then install the new microSD card into the Pi 400 and repower it. The setup process will take a little time, and then ask some questions to get the system up and running. After it finishes with the setup, go into the Firefox Web Browser and at the top click on the 3 bars at the top right (Open Application Menu). Under Preferences, Files and Applications, click on "Always ask you where to save files" as we will be saving files to several different places. It would probably be a good idea to also go through all of the different settings and get them the way you want. Another place to check to get things to where one can see them is the top right hand corner where the power and internet connections show and click on it, then click on "Settings." Under Accessibility, I turned on "Large Text" and on the Cursor Size I went with "Larger" so I could see where the mouse pointer was. The question on a new system is always, "Where did they hide this function?" At this point I think we are ready to start getting "thttpd" from http://Acme.com/ and the documentation loaded. 32GB-Ubuntu-64-Desktop.txt frank@frank-desktop:~$ w 21:47:38 up 35 min, 1 user, load average: 0.05, 0.32, 0.41 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT frank tty2 tty2 21:11 52days 0.18s 0.16s /usr/libexec/gnome-session-binary --systemd --session=ubuntu frank@frank-desktop:~$ df -h Filesystem Size Used Avail Use% Mounted on tmpfs 374M 4.5M 370M 2% /run /dev/mmcblk0p2 29G 6.2G 21G 23% / tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup /dev/mmcblk0p1 253M 120M 133M 48% /boot/firmware tmpfs 374M 136K 374M 1% /run/user/1000 frank@frank-desktop:~$ Add: Settings, Terminal, and Text Editor to Activities Column (9 dots at bottom, scroll down, right click on "Add to Favorites". text Editor Go through and check all settings on Settings, Terminal, and Text Editor. Click 3 bars on Terminal, Text Editor, and Firefox Web Browser then preferences. ************ The first thing is to download "freedom.zip" from my website, http://162.250.19.7/ which will come up with a green screen, and click on "freedom/" which will open the directory, and then click on "freedom.zip", then click "Save File" and click "OK" Which if this is the first file you are trying to save will show, in my case, a little house icon and "frank", followed by Downloads. We want to save "freedom.zip" to the main user (house icon) so I click on "(frank)" so it will go into my home directory. Later in the process there is a command "cd ~/freedom" which is going to look for the directory "freedom" in the main users (frank in my case) home directory. Now click "Save" at the top right. Now click on the "file folder icon" (Files) and one should see the house icon with "Home" and freedom.zip lower on the page. Right click on "freedom.zip" and click on "Extract Here" which will put a directory "freedom" up on the page. Doubble click on "freedom" to open it, and doubble click on "2021-06-15-Install-..." which is this file. Hopefully your monitor is wide enough to be able to have two windows open at once, the directions on one and the commands and results on the other, since I will just copy the text from the screen as I go through the build and paste it to this file. I will basically be following the directions on the old install "2019-12-26-Install..." which was the dual boot Raspian Desktop install on an old Windows 7 notebook and is almost the same for any Raspiain install. The only difference is the text that comes out as it installs to an x86 processor rather than an ARM processor. At this point, you have your computer setup, and up and running linux (Ubuntu 64 Desktop). In the folder Home (house icon), make a folder (click Top right 3 bars, then click the file folder top right (New Folder)) the New Folder name is: Acme.com and then click Create. The folder "Acme.com" should now be shown. Doubble click on this folder to open it, it should be empty. On Firefox click the "+" (Open a new tab), click "... Enter Address", and enter: http://acme.com/ and then press enter. This brings up a green page labeled "ACME Laboratories." Right click in the green - "Save Page as ..." The Name is: ACME Laboratories.html, with a house icon and "(frank)" (the primary user) followed by "Downloads" so doubble click on the folder "Acme.com" which will replace the directory "Downloads", and click Save at the upper right. Now you should have a folder and an html file in the Acme.com folder. Back on the green "Home" page, the third black bullet down (The ACME Labs freeware library.) click on "thttpd" - tiny/turbo/throttling web server. Right click on green - "Save as ..." click, Name: thttpd.html with "house icon (frank)" and "Acme.com" and at page top right, click "Save." Now you should have another thttpd folder and html file. I think you get the idea. "thttpd - tiny/turbo/throttling HTTP server" page. Click "Fetch the software." Name: thttpd-2.29.tar.gz (this number could grow), with "(frank)" "Acme.com" - click "Save File" and OK, the Name thttpd-2.29.tar.gz and house icon (frank) Acme.com click on Save top right. The "Release notes" are lower down the page so we don't need to click and save them. Click "comparison chart" right click and "Save as ..." click, Name: Web Server Comparisons.html with "(frank)" "Acme.com" and click "Save." You will see the benchmarks were last updated 12jul98, about 23 years ago, and computers are much faster now! go back a page. The "(URL-traffic-based throttling)" is in thttpd man page.html. Click "HTMLized man page" right click and "Save as ..." click, Name: thttpd man page.html with "(frank)" "Acme.com" click "Save", go back one page. Click "thttpd notes", right click "Save as ..." click, Name: thttpd notes.html, with "(frank)" "Acme.com" click "Save", go back one page. Click "options guide", right click "Save as ..." click, Name: Configuration Options.html, with "(frank)" "Acme.com", click "Save", go back one page. Click "auxiliary programs", right click "Save as ..." click, Name: Auxiliary Programs.html, with "(frank)" "Acme.com", click "Save". Under "auxiliary programs" we now want to save all 5 of these man pages. Click makeweb page highlight, right click "Save as ..." click, Name: makeweb man page.html, with "(frank)" Acme.com", click "Save", go back one page. Click htpasswd page highlight, right click, "Save as ...", click, Name: htpasswd man page.html, with "(frank)" "Acme.com", click "Save", go back one page. Click ssi page highlight, right click, "Save as ...", click, Name: ssi man page.html, with "(frank)" "Acme.com", click "Save", go back one page. Click redirect page highlight, right click, "Save as ...", click, Name: redirect man page.html, with "(frank)" "Acme.com", click "Save", go back one page. Click syslogtocern page highlight, right click, "Save as ..." click, Name: syslogtocern man page.html, with "(frank)" "Acme.com", click "Save", go back one page. We have saved all 5 axillary program man pages so go back one more page. Click "web server comparisons", right click "Save as ..." click, Name: Web Server Comparisons.html, with "(frank)" "Acme.com", click "Save". The "http_load - multiprocessing http test client" is the documentation on the benchmark program if you are interested. It is after the benchmark test system paragraph. Click "other web resources", right click "Save as ..." click, Name: Other Web Resources.html, with "(frank)" "Acme.com", click "Save". That should cover most of what we need for thttpd, and can now quit the web browser. Click the left column "Text Editor" icon and at the top (3 bars) click and select Preferences. Under "View", we want everything BUT "Display right margin at column: " and Display grid pattern" so we have line numbers, and lines that may be several lines long. You might also want to check the other options as well. In File manager: (The file folder icon down the left side "File"). Open /Home/Acme.com (dobble click on Acme.com). Right click on thttpd-2.29.tar.gz and click "Extract Here." You should now see a directory labeled "thttpd-2.29." Double click this directory to open it. At this point, you will want to make a "New Window" by right clicking on the "Text Editor" (left column icon) and clicking "New Window" then go back to the window "Home/Acme.com/thttpd-2.29" (left column "File" icon) and doubble Click on "INSTALL." These are the instructions we need to install thttpd. Since thttpd is a portable program, we will have to build it for our machine. Click the left column "File" icon to bring "thttpd-2.29" back. The first thing to do is read through the "config.h" file to get an idea what thttpd does and its controls, so build a new window in the left "Text Editor" icon and then move the window to the side and double click on the file "config.h" (opening "config.h" in Text Editor). We need to make a change - at line 130, (a blank line), add 2 more blank lines by pressing enter. Highlight line 127, (#define TILDE_MAP_1 "users"), right click and select copy. Move to blank line #131, right click and select paste. Line 131 should now be the same as line 127. Select "SAVE" at the top of the window (config.h). This is so we can use different "users" for our website with different passwords from "(frank)" for another layer of security. You might want to read through the "config.h" file to get an idea of what "thttpd" can do. The file "config.h" can now be closed. Open a "terminal" full screen, (click on the 9 dots icon in the left "Favorites" column, scroll to the terminal icon, right click and "Add to Favorites" to put it in the left "Favorites" column). frank@frank-desktop:~$ cd /etc frank@frank-desktop:/etc$ cat group # (we are looking for a group "www") root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog,frank tty:x:5: disk:x:6: lp:x:7: mail:x:8: news:x:9: uucp:x:10: man:x:12: proxy:x:13: kmem:x:15: dialout:x:20: fax:x:21: voice:x:22: cdrom:x:24:frank floppy:x:25: tape:x:26: sudo:x:27:frank audio:x:29:pulse dip:x:30:frank www-data:x:33: backup:x:34: operator:x:37: list:x:38: irc:x:39: src:x:40: gnats:x:41: shadow:x:42: utmp:x:43: video:x:44: sasl:x:45: plugdev:x:46:frank staff:x:50: games:x:60: users:x:100: nogroup:x:65534: systemd-journal:x:101: systemd-network:x:102: systemd-resolve:x:103: systemd-timesync:x:104: crontab:x:105: messagebus:x:106: input:x:107: kvm:x:108: render:x:109: syslog:x:110: tss:x:111: bluetooth:x:112: ssl-cert:x:113: uuidd:x:114: tcpdump:x:115: ssh:x:116: avahi-autoipd:x:117: rdma:x:118: rtkit:x:119: netdev:x:120: avahi:x:121: lpadmin:x:122:frank nm-openvpn:x:123: whoopsie:x:124: sssd:x:125: scanner:x:126:saned saned:x:127: colord:x:128: geoclue:x:129: pulse:x:130: pulse-access:x:131: gdm:x:132: lxd:x:133:frank systemd-coredump:x:999: frank:x:1000: sambashare:x:134:frank frank@frank-desktop:/etc$ Since there is no group "www" with the user "(frank)" we will need to add this, getting the directions by using "--help" to see our options. frank@frank-desktop:/etc$ addgroup --help adduser [--home DIR] [--shell SHELL] [--no-create-home] [--uid ID] [--firstuid ID] [--lastuid ID] [--gecos GECOS] [--ingroup GROUP | --gid ID] [--disabled-password] [--disabled-login] [--add_extra_groups] [--encrypt-home] USER Add a normal user adduser --system [--home DIR] [--shell SHELL] [--no-create-home] [--uid ID] [--gecos GECOS] [--group | --ingroup GROUP | --gid ID] [--disabled-password] [--disabled-login] [--add_extra_groups] USER Add a system user adduser --group [--gid ID] GROUP addgroup [--gid ID] GROUP Add a user group addgroup --system [--gid ID] GROUP Add a system group adduser USER GROUP Add an existing user to an existing group general options: --quiet | -q don't give process information to stdout --force-badname allow usernames which do not match the NAME_REGEX[_SYSTEM] configuration variable --extrausers uses extra users as the database --help | -h usage message --version | -v version number and copyright --conf | -c FILE use FILE as configuration file ******* frank@frank-desktop:/etc$ From this we get the commands we need to add a system group "www" and make "(frank)" a member of this group. addgroup --system [--gid ID] GROUP Add a system group adduser USER GROUP Add an existing user to an existing group We need to add a system group "www" and make "(frank)" a member of this group. frank@frank-desktop:/etc$ frank@frank-desktop:/etc$ sudo addgroup --system www [sudo] password for frank: Adding group `www' (GID 135) ... Done. frank@frank-desktop:/etc$ frank@frank-desktop:/etc$ frank@frank-desktop:/etc$ sudo adduser frank www Adding user `frank' to group `www' ... Adding user frank to group www Done. frank@frank-desktop:/etc$ frank@frank-desktop:/etc$ cat group root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog,frank tty:x:5: disk:x:6: lp:x:7: mail:x:8: news:x:9: uucp:x:10: man:x:12: proxy:x:13: kmem:x:15: dialout:x:20: fax:x:21: voice:x:22: cdrom:x:24:frank floppy:x:25: tape:x:26: sudo:x:27:frank audio:x:29:pulse dip:x:30:frank www-data:x:33: backup:x:34: operator:x:37: list:x:38: irc:x:39: src:x:40: gnats:x:41: shadow:x:42: utmp:x:43: video:x:44: sasl:x:45: plugdev:x:46:frank staff:x:50: games:x:60: users:x:100: nogroup:x:65534: systemd-journal:x:101: systemd-network:x:102: systemd-resolve:x:103: systemd-timesync:x:104: crontab:x:105: messagebus:x:106: input:x:107: kvm:x:108: render:x:109: syslog:x:110: tss:x:111: bluetooth:x:112: ssl-cert:x:113: uuidd:x:114: tcpdump:x:115: ssh:x:116: avahi-autoipd:x:117: rdma:x:118: rtkit:x:119: netdev:x:120: avahi:x:121: lpadmin:x:122:frank nm-openvpn:x:123: whoopsie:x:124: sssd:x:125: scanner:x:126:saned saned:x:127: colord:x:128: geoclue:x:129: pulse:x:130: pulse-access:x:131: gdm:x:132: lxd:x:133:frank systemd-coredump:x:999: frank:x:1000: sambashare:x:134:frank www:x:135:frank frank@frank-desktop:/etc$ Success, Group "www" has a user "(frank)" and is also less than 1000, (the number will probably be different than 135). thttpd is missing some directories so if we add them it will compile without any problems. frank@frank-desktop:/etc$ frank@frank-desktop:/etc$ cd /usr/local frank@frank-desktop:/usr/local$ ls -al total 40 drwxr-xr-x 10 root root 4096 Apr 21 17:52 . drwxr-xr-x 11 root root 4096 Apr 21 17:52 .. drwxr-xr-x 2 root root 4096 Apr 21 17:52 bin drwxr-xr-x 2 root root 4096 Apr 21 17:52 etc drwxr-xr-x 2 root root 4096 Apr 21 17:52 games drwxr-xr-x 2 root root 4096 Apr 21 17:52 include drwxr-xr-x 3 root root 4096 Apr 21 17:52 lib lrwxrwxrwx 1 root root 9 Apr 21 17:52 man -> share/man drwxr-xr-x 2 root root 4096 Apr 21 17:52 sbin drwxr-xr-x 7 root root 4096 Apr 21 18:00 share drwxr-xr-x 2 root root 4096 Apr 21 17:52 src frank@frank-desktop:/usr/local$ frank@frank-desktop:/usr/local$ cd man frank@frank-desktop:/usr/local/man$ ls -al total 8 drwxr-xr-x 2 root root 4096 Apr 21 17:52 . drwxr-xr-x 7 root root 4096 Apr 21 18:00 .. frank@frank-desktop:/usr/local/man$ We need to add directories; “man1” and “man8” to the “man” directory, “man 8” is in the program but “man1” is not so we will add both. frank@frank-desktop:/usr/local/man$ frank@frank-desktop:/usr/local/man$ sudo mkdir -p /usr/local/man/man1 man8 [sudo] password for frank: frank@frank-desktop:/usr/local/man$ ls -al total 16 drwxr-xr-x 4 root root 4096 May 26 13:31 . drwxr-xr-x 7 root root 4096 Apr 21 18:00 .. drwxr-xr-x 2 root root 4096 May 26 13:31 man1 drwxr-xr-x 2 root root 4096 May 26 13:31 man8 frank@frank-desktop:/usr/local/man$ frank@frank-desktop:/usr/local/man$ frank@frank-desktop:/usr/local/man$ cd ~/Acme.com/thttpd-2.29 frank@frank-desktop:~/Acme.com/thttpd-2.29$ This is installing thttpd on a RaspberryPi 400 running ubuntu-21.04-desktop-arm64. So you have an idea of what to expect, I am including all of the printout that happens in each step. The directions from "INSTALL": INSTALL To build: % ./configure Edit config.h to change the configuration options if necessary. % make To install: % make install Edit one of your system rc files to run thttpd at boot time. Do NOT run it from inetd, that setup is inefficient so thttpd doesn't support it. frank@frank-desktop:~/Acme.com/thttpd-2.29$ frank@frank-desktop:~/Acme.com/thttpd-2.29$ ls # (This is to make sure we are at the right place.) aclocal.m4 config.guess configure extras FILES install-sh Makefile.in mime_encodings.txt mmc.h strerror.c thttpd.8 timers.h cgi-bin config.h configure.in fdwatch.c index.html libhttpd.c match.c mime_types.txt README tdate_parse.c thttpd.c TODO cgi-src config.sub contrib fdwatch.h INSTALL libhttpd.h match.h mmc.c scripts tdate_parse.h timers.c version.h frank@frank-desktop:~/Acme.com/thttpd-2.29$ Step #1 of "INSTALL" frank@frank-desktop:~/Acme.com/thttpd-2.29$ frank@frank-desktop:~/Acme.com/thttpd-2.29$ ./configure creating cache ./config.cache checking host system type... Invalid configuration `aarch64-pc-linux-gnuoldld': machine `aarch64-pc' not recognized checking target system type... Invalid configuration `aarch64-pc-linux-gnuoldld': machine `aarch64-pc' not recognized checking build system type... Invalid configuration `aarch64-pc-linux-gnuoldld': machine `aarch64-pc' not recognized checking for gcc... no checking for cc... no configure: error: no acceptable cc found in $PATH frank@frank-desktop:~/Acme.com/thttpd-2.29$ We are missing "gcc" and probably "make" so we will install both. frank@frank-desktop:~/Acme.com/thttpd-2.29$ frank@frank-desktop:~/Acme.com/thttpd-2.29$ sudo apt install gcc [sudo] password for frank: Reading package lists... Done Building dependency tree... Done Reading state information... Done The following packages were automatically installed and are no longer required: cryptsetup-bin dctrl-tools dmeventd dmraid dpkg-repack efibootmgr gir1.2-timezonemap-1.0 gir1.2-xkl-1.0 grub-common grub-efi-arm64 grub-efi-arm64-bin grub-efi-arm64-signed grub2-common kpartx kpartx-boot libdebian-installer4 libdevmapper-event1.02.1 libdmraid1.0.0.rc16 liblvm2cmd2.03 libtimezonemap-data libtimezonemap1 lvm2 os-prober python3-icu python3-pam rdate thin-provisioning-tools Use 'sudo apt autoremove' to remove them. The following additional packages will be installed: gcc-10 libasan6 libatomic1 libc-dev-bin libc-devtools libc6-dev libcc1-0 libcrypt-dev libgcc-10-dev libitm1 liblsan0 libnsl-dev libtirpc-dev libtsan0 libubsan1 linux-libc-dev manpages-dev rpcsvc-proto Suggested packages: gcc-multilib make autoconf automake libtool flex bison gcc-doc gcc-10-doc gcc-10-locales glibc-doc The following NEW packages will be installed: gcc gcc-10 libasan6 libatomic1 libc-dev-bin libc-devtools libc6-dev libcc1-0 libcrypt-dev libgcc-10-dev libitm1 liblsan0 libnsl-dev libtirpc-dev libtsan0 libubsan1 linux-libc-dev manpages-dev rpcsvc-proto 0 upgraded, 19 newly installed, 0 to remove and 0 not upgraded. Need to get 28.3 MB of archives. After this operation, 108 MB of additional disk space will be used. Do you want to continue? [Y/n] y Get:1 http://ports.ubuntu.com/ubuntu-ports hirsute-updates/main arm64 libcc1-0 arm64 11.1.0-1ubuntu1~21.04 [46.4 kB] Get:2 http://ports.ubuntu.com/ubuntu-ports hirsute-updates/main arm64 libitm1 arm64 11.1.0-1ubuntu1~21.04 [24.1 kB] Get:3 http://ports.ubuntu.com/ubuntu-ports hirsute-updates/main arm64 libatomic1 arm64 11.1.0-1ubuntu1~21.04 [9,868 B] Get:4 http://ports.ubuntu.com/ubuntu-ports hirsute-updates/main arm64 libasan6 arm64 11.1.0-1ubuntu1~21.04 [2,103 kB] Get:5 http://ports.ubuntu.com/ubuntu-ports hirsute-updates/main arm64 liblsan0 arm64 11.1.0-1ubuntu1~21.04 [858 kB] Get:6 http://ports.ubuntu.com/ubuntu-ports hirsute-updates/main arm64 libtsan0 arm64 11.1.0-1ubuntu1~21.04 [2,060 kB] Get:7 http://ports.ubuntu.com/ubuntu-ports hirsute-updates/main arm64 libubsan1 arm64 11.1.0-1ubuntu1~21.04 [824 kB] Get:8 http://ports.ubuntu.com/ubuntu-ports hirsute/main arm64 libgcc-10-dev arm64 10.3.0-1ubuntu1 [907 kB] Get:9 http://ports.ubuntu.com/ubuntu-ports hirsute/main arm64 gcc-10 arm64 10.3.0-1ubuntu1 [15.8 MB] Get:10 http://ports.ubuntu.com/ubuntu-ports hirsute/main arm64 gcc arm64 4:10.3.0-1ubuntu1 [5,228 B] Get:11 http://ports.ubuntu.com/ubuntu-ports hirsute/main arm64 libc-dev-bin arm64 2.33-0ubuntu5 [18.3 kB] Get:12 http://ports.ubuntu.com/ubuntu-ports hirsute/main arm64 libc-devtools arm64 2.33-0ubuntu5 [25.7 kB] Get:13 http://ports.ubuntu.com/ubuntu-ports hirsute-updates/main arm64 linux-libc-dev arm64 5.11.0-17.18 [1,181 kB] Get:14 http://ports.ubuntu.com/ubuntu-ports hirsute/main arm64 libcrypt-dev arm64 1:4.4.17-1ubuntu3 [109 kB] Get:15 http://ports.ubuntu.com/ubuntu-ports hirsute/main arm64 rpcsvc-proto arm64 1.4.2-0ubuntu4 [59.7 kB] Get:16 http://ports.ubuntu.com/ubuntu-ports hirsute/main arm64 libtirpc-dev arm64 1.3.1-1build1 [185 kB] Get:17 http://ports.ubuntu.com/ubuntu-ports hirsute/main arm64 libnsl-dev arm64 1.3.0-0ubuntu3 [65.6 kB] Get:18 http://ports.ubuntu.com/ubuntu-ports hirsute/main arm64 libc6-dev arm64 2.33-0ubuntu5 [1,719 kB] Get:19 http://ports.ubuntu.com/ubuntu-ports hirsute/main arm64 manpages-dev all 5.10-1 [2,309 kB] Fetched 28.3 MB in 2min 4s (228 kB/s) Selecting previously unselected package libcc1-0:arm64. (Reading database ... 170825 files and directories currently installed.) Preparing to unpack .../00-libcc1-0_11.1.0-1ubuntu1~21.04_arm64.deb ... Unpacking libcc1-0:arm64 (11.1.0-1ubuntu1~21.04) ... Selecting previously unselected package libitm1:arm64. Preparing to unpack .../01-libitm1_11.1.0-1ubuntu1~21.04_arm64.deb ... Unpacking libitm1:arm64 (11.1.0-1ubuntu1~21.04) ... Selecting previously unselected package libatomic1:arm64. Preparing to unpack .../02-libatomic1_11.1.0-1ubuntu1~21.04_arm64.deb ... Unpacking libatomic1:arm64 (11.1.0-1ubuntu1~21.04) ... Selecting previously unselected package libasan6:arm64. Preparing to unpack .../03-libasan6_11.1.0-1ubuntu1~21.04_arm64.deb ... Unpacking libasan6:arm64 (11.1.0-1ubuntu1~21.04) ... Selecting previously unselected package liblsan0:arm64. Preparing to unpack .../04-liblsan0_11.1.0-1ubuntu1~21.04_arm64.deb ... Unpacking liblsan0:arm64 (11.1.0-1ubuntu1~21.04) ... Selecting previously unselected package libtsan0:arm64. Preparing to unpack .../05-libtsan0_11.1.0-1ubuntu1~21.04_arm64.deb ... Unpacking libtsan0:arm64 (11.1.0-1ubuntu1~21.04) ... Selecting previously unselected package libubsan1:arm64. Preparing to unpack .../06-libubsan1_11.1.0-1ubuntu1~21.04_arm64.deb ... Unpacking libubsan1:arm64 (11.1.0-1ubuntu1~21.04) ... Selecting previously unselected package libgcc-10-dev:arm64. Preparing to unpack .../07-libgcc-10-dev_10.3.0-1ubuntu1_arm64.deb ... Unpacking libgcc-10-dev:arm64 (10.3.0-1ubuntu1) ... Selecting previously unselected package gcc-10. Preparing to unpack .../08-gcc-10_10.3.0-1ubuntu1_arm64.deb ... Unpacking gcc-10 (10.3.0-1ubuntu1) ... Selecting previously unselected package gcc. Preparing to unpack .../09-gcc_4%3a10.3.0-1ubuntu1_arm64.deb ... Unpacking gcc (4:10.3.0-1ubuntu1) ... Selecting previously unselected package libc-dev-bin. Preparing to unpack .../10-libc-dev-bin_2.33-0ubuntu5_arm64.deb ... Unpacking libc-dev-bin (2.33-0ubuntu5) ... Selecting previously unselected package libc-devtools. Preparing to unpack .../11-libc-devtools_2.33-0ubuntu5_arm64.deb ... Unpacking libc-devtools (2.33-0ubuntu5) ... Selecting previously unselected package linux-libc-dev:arm64. Preparing to unpack .../12-linux-libc-dev_5.11.0-17.18_arm64.deb ... Unpacking linux-libc-dev:arm64 (5.11.0-17.18) ... Selecting previously unselected package libcrypt-dev:arm64. Preparing to unpack .../13-libcrypt-dev_1%3a4.4.17-1ubuntu3_arm64.deb ... Unpacking libcrypt-dev:arm64 (1:4.4.17-1ubuntu3) ... Selecting previously unselected package rpcsvc-proto. Preparing to unpack .../14-rpcsvc-proto_1.4.2-0ubuntu4_arm64.deb ... Unpacking rpcsvc-proto (1.4.2-0ubuntu4) ... Selecting previously unselected package libtirpc-dev:arm64. Preparing to unpack .../15-libtirpc-dev_1.3.1-1build1_arm64.deb ... Unpacking libtirpc-dev:arm64 (1.3.1-1build1) ... Selecting previously unselected package libnsl-dev:arm64. Preparing to unpack .../16-libnsl-dev_1.3.0-0ubuntu3_arm64.deb ... Unpacking libnsl-dev:arm64 (1.3.0-0ubuntu3) ... Selecting previously unselected package libc6-dev:arm64. Preparing to unpack .../17-libc6-dev_2.33-0ubuntu5_arm64.deb ... Unpacking libc6-dev:arm64 (2.33-0ubuntu5) ... Selecting previously unselected package manpages-dev. Preparing to unpack .../18-manpages-dev_5.10-1_all.deb ... Unpacking manpages-dev (5.10-1) ... Setting up manpages-dev (5.10-1) ... Setting up linux-libc-dev:arm64 (5.11.0-17.18) ... Setting up libasan6:arm64 (11.1.0-1ubuntu1~21.04) ... Setting up libtirpc-dev:arm64 (1.3.1-1build1) ... Setting up rpcsvc-proto (1.4.2-0ubuntu4) ... Setting up libatomic1:arm64 (11.1.0-1ubuntu1~21.04) ... Setting up libubsan1:arm64 (11.1.0-1ubuntu1~21.04) ... Setting up libnsl-dev:arm64 (1.3.0-0ubuntu3) ... Setting up libcrypt-dev:arm64 (1:4.4.17-1ubuntu3) ... Setting up libc-dev-bin (2.33-0ubuntu5) ... Setting up libcc1-0:arm64 (11.1.0-1ubuntu1~21.04) ... Setting up liblsan0:arm64 (11.1.0-1ubuntu1~21.04) ... Setting up libitm1:arm64 (11.1.0-1ubuntu1~21.04) ... Setting up libc-devtools (2.33-0ubuntu5) ... Setting up libtsan0:arm64 (11.1.0-1ubuntu1~21.04) ... Setting up libgcc-10-dev:arm64 (10.3.0-1ubuntu1) ... Setting up gcc-10 (10.3.0-1ubuntu1) ... Setting up libc6-dev:arm64 (2.33-0ubuntu5) ... Setting up gcc (4:10.3.0-1ubuntu1) ... Processing triggers for man-db (2.9.4-2) ... Processing triggers for libc-bin (2.33-0ubuntu5) ... frank@frank-desktop:~/Acme.com/thttpd-2.29$ *************** frank@frank-desktop:~/Acme.com/thttpd-2.29$ frank@frank-desktop:~/Acme.com/thttpd-2.29$ sudo apt install make Reading package lists... Done Building dependency tree... Done Reading state information... Done The following packages were automatically installed and are no longer required: cryptsetup-bin dctrl-tools dmeventd dmraid dpkg-repack efibootmgr gir1.2-timezonemap-1.0 gir1.2-xkl-1.0 grub-common grub-efi-arm64 grub-efi-arm64-bin grub-efi-arm64-signed grub2-common kpartx kpartx-boot libdebian-installer4 libdevmapper-event1.02.1 libdmraid1.0.0.rc16 liblvm2cmd2.03 libtimezonemap-data libtimezonemap1 lvm2 os-prober python3-icu python3-pam rdate thin-provisioning-tools Use 'sudo apt autoremove' to remove them. Suggested packages: make-doc The following NEW packages will be installed: make 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 158 kB of archives. After this operation, 406 kB of additional disk space will be used. Get:1 http://ports.ubuntu.com/ubuntu-ports hirsute/main arm64 make arm64 4.3-4ubuntu1 [158 kB] Fetched 158 kB in 1s (138 kB/s) Selecting previously unselected package make. (Reading database ... 174762 files and directories currently installed.) Preparing to unpack .../make_4.3-4ubuntu1_arm64.deb ... Unpacking make (4.3-4ubuntu1) ... Setting up make (4.3-4ubuntu1) ... Processing triggers for man-db (2.9.4-2) ... frank@frank-desktop:~/Acme.com/thttpd-2.29$ Now lets try again. frank@frank-desktop:~/Acme.com/thttpd-2.29$ frank@frank-desktop:~/Acme.com/thttpd-2.29$ ./configure loading cache ./config.cache checking host system type... Invalid configuration `aarch64-pc-linux-gnuoldld': machine `aarch64-pc' not recognized checking target system type... Invalid configuration `aarch64-pc-linux-gnuoldld': machine `aarch64-pc' not recognized checking build system type... Invalid configuration `aarch64-pc-linux-gnuoldld': machine `aarch64-pc' not recognized checking for gcc... (cached) gcc checking whether the C compiler (gcc ) works... yes checking whether the C compiler (gcc ) is a cross-compiler... no checking whether we are using GNU C... (cached) yes checking whether gcc accepts -g... (cached) yes checking gcc version... (cached) 10 checking how to link static binaries... (cached) unknown checking for __progname... (cached) yes checking how to run the C preprocessor... (cached) gcc -E checking for fcntl.h... (cached) yes checking for grp.h... (cached) yes checking for memory.h... (cached) yes checking for paths.h... (cached) yes checking for poll.h... (cached) yes checking for sys/poll.h... (cached) yes checking for sys/devpoll.h... (cached) no checking for sys/event.h... (cached) no checking for osreldate.h... (cached) no checking whether time.h and sys/time.h may both be included... (cached) yes checking for dirent.h that defines DIR... (cached) yes checking for opendir in -ldir... (cached) no checking for /usr/local/v6/lib... no checking for gethostbyname... (cached) yes checking for socket... (cached) yes checking for main in -linet6... (cached) no checking for crypt... (cached) no checking for crypt in -lcrypt... (cached) yes checking for hstrerror... (cached) yes checking for strerror... (cached) yes checking for waitpid... (cached) yes checking for vsnprintf... (cached) yes checking for daemon... (cached) yes checking for setsid... (cached) yes checking for setlogin... (cached) no checking for getaddrinfo... (cached) yes checking for getnameinfo... (cached) yes checking for gai_strerror... (cached) yes checking for kqueue... (cached) no checking for sigset... (cached) yes checking for atoll... (cached) yes checking for unistd.h... (cached) yes checking for getpagesize... (cached) yes checking for working mmap... (cached) yes checking for select... (cached) yes checking for poll... (cached) yes checking if struct tm has tm_gmtoff member... (cached) yes checking if int64_t exists... (cached) yes checking if socklen_t exists... (cached) yes checking whether make sets ${MAKE}... (cached) yes checking for a BSD compatible install... (cached) /usr/bin/install -c creating ./config.status creating Makefile creating cgi-src/Makefile creating extras/Makefile frank@frank-desktop:~/Acme.com/thttpd-2.29$ It completed so on to the next step. Step #2 of "INSTALL" frank@frank-desktop:~/Acme.com/thttpd-2.29$ frank@frank-desktop:~/Acme.com/thttpd-2.29$ make gcc -O2 -DHAVE__PROGNAME=1 -DHAVE_FCNTL_H=1 -DHAVE_GRP_H=1 -DHAVE_MEMORY_H=1 -DHAVE_PATHS_H=1 -DHAVE_POLL_H=1 -DHAVE_SYS_POLL_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_DIRENT_H=1 -DHAVE_LIBCRYPT=1 -DHAVE_STRERROR=1 -DHAVE_WAITPID=1 -DHAVE_VSNPRINTF=1 -DHAVE_DAEMON=1 -DHAVE_SETSID=1 -DHAVE_GETADDRINFO=1 -DHAVE_GETNAMEINFO=1 -DHAVE_GAI_STRERROR=1 -DHAVE_SIGSET=1 -DHAVE_ATOLL=1 -DHAVE_UNISTD_H=1 -DHAVE_GETPAGESIZE=1 -DHAVE_MMAP=1 -DHAVE_SELECT=1 -DHAVE_POLL=1 -DHAVE_TM_GMTOFF=1 -DHAVE_INT64T=1 -DHAVE_SOCKLENT=1 -I. -c thttpd.c thttpd.c: In function ‘main’: thttpd.c:611:12: warning: implicit declaration of function ‘sigset’; did you mean ‘isset’? [-Wimplicit-function-declaration] 611 | (void) sigset( SIGTERM, handle_term ); | ^~~~~~ | isset thttpd.c:487:12: warning: ignoring return value of ‘getcwd’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 487 | (void) getcwd( cwd, sizeof(cwd) - 1 ); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ thttpd.c: In function ‘handle_alrm’: thttpd.c:312:9: warning: ignoring return value of ‘chdir’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 312 | (void) chdir( "/tmp" ); | ^~~~~~~~~~~~~~~ rm -f mime_encodings.h sed < mime_encodings.txt > mime_encodings.h \ -e 's/#.*//' -e 's/[ ]*$//' -e '/^$/d' \ -e 's/[ ][ ]*/", 0, "/' -e 's/^/{ "/' -e 's/$/", 0 },/' rm -f mime_types.h sed < mime_types.txt > mime_types.h \ -e 's/#.*//' -e 's/[ ]*$//' -e '/^$/d' \ -e 's/[ ][ ]*/", 0, "/' -e 's/^/{ "/' -e 's/$/", 0 },/' gcc -O2 -DHAVE__PROGNAME=1 -DHAVE_FCNTL_H=1 -DHAVE_GRP_H=1 -DHAVE_MEMORY_H=1 -DHAVE_PATHS_H=1 -DHAVE_POLL_H=1 -DHAVE_SYS_POLL_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_DIRENT_H=1 -DHAVE_LIBCRYPT=1 -DHAVE_STRERROR=1 -DHAVE_WAITPID=1 -DHAVE_VSNPRINTF=1 -DHAVE_DAEMON=1 -DHAVE_SETSID=1 -DHAVE_GETADDRINFO=1 -DHAVE_GETNAMEINFO=1 -DHAVE_GAI_STRERROR=1 -DHAVE_SIGSET=1 -DHAVE_ATOLL=1 -DHAVE_UNISTD_H=1 -DHAVE_GETPAGESIZE=1 -DHAVE_MMAP=1 -DHAVE_SELECT=1 -DHAVE_POLL=1 -DHAVE_TM_GMTOFF=1 -DHAVE_INT64T=1 -DHAVE_SOCKLENT=1 -I. -c libhttpd.c libhttpd.c: In function ‘cgi_child’: libhttpd.c:3557:12: warning: implicit declaration of function ‘sigset’; did you mean ‘isset’? [-Wimplicit-function-declaration] 3557 | (void) sigset( SIGPIPE, SIG_DFL ); | ^~~~~~ | isset libhttpd.c: In function ‘ls’: libhttpd.c:2781:13: warning: ignoring return value of ‘nice’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 2781 | (void) nice( CGI_NICE ); | ^~~~~~~~~~~~~~~~ libhttpd.c: In function ‘cgi_child’: libhttpd.c:3533:12: warning: ignoring return value of ‘nice’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 3533 | (void) nice( CGI_NICE ); | ^~~~~~~~~~~~~~~~ libhttpd.c:3551:13: warning: ignoring return value of ‘chdir’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 3551 | (void) chdir( directory ); /* ignore errors */ | ^~~~~~~~~~~~~~~~~~ libhttpd.c: In function ‘post_post_garbage_hack’: libhttpd.c:3249:12: warning: ignoring return value of ‘read’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 3249 | (void) read( hc->conn_fd, buf, sizeof(buf) ); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from /usr/include/string.h:519, from /usr/include/memory.h:29, from libhttpd.c:47: In function ‘strncpy’, inlined from ‘ls’ at libhttpd.c:2846:10: /usr/include/aarch64-linux-gnu/bits/string_fortified.h:95:10: warning: ‘__builtin_strncpy’ specified bound depends on the length of the source argument [-Wstringop-overflow=] 95 | return __builtin___strncpy_chk (__dest, __src, __len, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | __glibc_objsize (__dest)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ libhttpd.c: In function ‘ls’: libhttpd.c:64:25: note: length computed here 64 | # define NAMLEN(dirent) strlen((dirent)->d_name) | ^~~~~~~~~~~~~~~~~~~~~~~~ libhttpd.c:2845:12: note: in expansion of macro ‘NAMLEN’ 2845 | namlen = NAMLEN(de); | ^~~~~~ gcc -O2 -DHAVE__PROGNAME=1 -DHAVE_FCNTL_H=1 -DHAVE_GRP_H=1 -DHAVE_MEMORY_H=1 -DHAVE_PATHS_H=1 -DHAVE_POLL_H=1 -DHAVE_SYS_POLL_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_DIRENT_H=1 -DHAVE_LIBCRYPT=1 -DHAVE_STRERROR=1 -DHAVE_WAITPID=1 -DHAVE_VSNPRINTF=1 -DHAVE_DAEMON=1 -DHAVE_SETSID=1 -DHAVE_GETADDRINFO=1 -DHAVE_GETNAMEINFO=1 -DHAVE_GAI_STRERROR=1 -DHAVE_SIGSET=1 -DHAVE_ATOLL=1 -DHAVE_UNISTD_H=1 -DHAVE_GETPAGESIZE=1 -DHAVE_MMAP=1 -DHAVE_SELECT=1 -DHAVE_POLL=1 -DHAVE_TM_GMTOFF=1 -DHAVE_INT64T=1 -DHAVE_SOCKLENT=1 -I. -c fdwatch.c gcc -O2 -DHAVE__PROGNAME=1 -DHAVE_FCNTL_H=1 -DHAVE_GRP_H=1 -DHAVE_MEMORY_H=1 -DHAVE_PATHS_H=1 -DHAVE_POLL_H=1 -DHAVE_SYS_POLL_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_DIRENT_H=1 -DHAVE_LIBCRYPT=1 -DHAVE_STRERROR=1 -DHAVE_WAITPID=1 -DHAVE_VSNPRINTF=1 -DHAVE_DAEMON=1 -DHAVE_SETSID=1 -DHAVE_GETADDRINFO=1 -DHAVE_GETNAMEINFO=1 -DHAVE_GAI_STRERROR=1 -DHAVE_SIGSET=1 -DHAVE_ATOLL=1 -DHAVE_UNISTD_H=1 -DHAVE_GETPAGESIZE=1 -DHAVE_MMAP=1 -DHAVE_SELECT=1 -DHAVE_POLL=1 -DHAVE_TM_GMTOFF=1 -DHAVE_INT64T=1 -DHAVE_SOCKLENT=1 -I. -c mmc.c gcc -O2 -DHAVE__PROGNAME=1 -DHAVE_FCNTL_H=1 -DHAVE_GRP_H=1 -DHAVE_MEMORY_H=1 -DHAVE_PATHS_H=1 -DHAVE_POLL_H=1 -DHAVE_SYS_POLL_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_DIRENT_H=1 -DHAVE_LIBCRYPT=1 -DHAVE_STRERROR=1 -DHAVE_WAITPID=1 -DHAVE_VSNPRINTF=1 -DHAVE_DAEMON=1 -DHAVE_SETSID=1 -DHAVE_GETADDRINFO=1 -DHAVE_GETNAMEINFO=1 -DHAVE_GAI_STRERROR=1 -DHAVE_SIGSET=1 -DHAVE_ATOLL=1 -DHAVE_UNISTD_H=1 -DHAVE_GETPAGESIZE=1 -DHAVE_MMAP=1 -DHAVE_SELECT=1 -DHAVE_POLL=1 -DHAVE_TM_GMTOFF=1 -DHAVE_INT64T=1 -DHAVE_SOCKLENT=1 -I. -c timers.c gcc -O2 -DHAVE__PROGNAME=1 -DHAVE_FCNTL_H=1 -DHAVE_GRP_H=1 -DHAVE_MEMORY_H=1 -DHAVE_PATHS_H=1 -DHAVE_POLL_H=1 -DHAVE_SYS_POLL_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_DIRENT_H=1 -DHAVE_LIBCRYPT=1 -DHAVE_STRERROR=1 -DHAVE_WAITPID=1 -DHAVE_VSNPRINTF=1 -DHAVE_DAEMON=1 -DHAVE_SETSID=1 -DHAVE_GETADDRINFO=1 -DHAVE_GETNAMEINFO=1 -DHAVE_GAI_STRERROR=1 -DHAVE_SIGSET=1 -DHAVE_ATOLL=1 -DHAVE_UNISTD_H=1 -DHAVE_GETPAGESIZE=1 -DHAVE_MMAP=1 -DHAVE_SELECT=1 -DHAVE_POLL=1 -DHAVE_TM_GMTOFF=1 -DHAVE_INT64T=1 -DHAVE_SOCKLENT=1 -I. -c match.c gcc -O2 -DHAVE__PROGNAME=1 -DHAVE_FCNTL_H=1 -DHAVE_GRP_H=1 -DHAVE_MEMORY_H=1 -DHAVE_PATHS_H=1 -DHAVE_POLL_H=1 -DHAVE_SYS_POLL_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_DIRENT_H=1 -DHAVE_LIBCRYPT=1 -DHAVE_STRERROR=1 -DHAVE_WAITPID=1 -DHAVE_VSNPRINTF=1 -DHAVE_DAEMON=1 -DHAVE_SETSID=1 -DHAVE_GETADDRINFO=1 -DHAVE_GETNAMEINFO=1 -DHAVE_GAI_STRERROR=1 -DHAVE_SIGSET=1 -DHAVE_ATOLL=1 -DHAVE_UNISTD_H=1 -DHAVE_GETPAGESIZE=1 -DHAVE_MMAP=1 -DHAVE_SELECT=1 -DHAVE_POLL=1 -DHAVE_TM_GMTOFF=1 -DHAVE_INT64T=1 -DHAVE_SOCKLENT=1 -I. -c tdate_parse.c gcc -O2 -DHAVE__PROGNAME=1 -DHAVE_FCNTL_H=1 -DHAVE_GRP_H=1 -DHAVE_MEMORY_H=1 -DHAVE_PATHS_H=1 -DHAVE_POLL_H=1 -DHAVE_SYS_POLL_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_DIRENT_H=1 -DHAVE_LIBCRYPT=1 -DHAVE_STRERROR=1 -DHAVE_WAITPID=1 -DHAVE_VSNPRINTF=1 -DHAVE_DAEMON=1 -DHAVE_SETSID=1 -DHAVE_GETADDRINFO=1 -DHAVE_GETNAMEINFO=1 -DHAVE_GAI_STRERROR=1 -DHAVE_SIGSET=1 -DHAVE_ATOLL=1 -DHAVE_UNISTD_H=1 -DHAVE_GETPAGESIZE=1 -DHAVE_MMAP=1 -DHAVE_SELECT=1 -DHAVE_POLL=1 -DHAVE_TM_GMTOFF=1 -DHAVE_INT64T=1 -DHAVE_SOCKLENT=1 -I. -o thttpd thttpd.o libhttpd.o fdwatch.o mmc.o timers.o match.o tdate_parse.o -lcrypt for i in cgi-src extras ; do ( \ cd $i ; \ pwd ; \ make \ WEBDIR=/usr/local/www \ CGIBINDIR=/usr/local/www/cgi-bin \ MANDIR=/usr/local/man \ WEBGROUP=www \ ) ; done /home/frank/Acme.com/thttpd-2.29/cgi-src make[1]: Entering directory '/home/frank/Acme.com/thttpd-2.29/cgi-src' gcc -O2 -DHAVE__PROGNAME=1 -DHAVE_FCNTL_H=1 -DHAVE_GRP_H=1 -DHAVE_MEMORY_H=1 -DHAVE_PATHS_H=1 -DHAVE_POLL_H=1 -DHAVE_SYS_POLL_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_DIRENT_H=1 -DHAVE_LIBCRYPT=1 -DHAVE_STRERROR=1 -DHAVE_WAITPID=1 -DHAVE_VSNPRINTF=1 -DHAVE_DAEMON=1 -DHAVE_SETSID=1 -DHAVE_GETADDRINFO=1 -DHAVE_GETNAMEINFO=1 -DHAVE_GAI_STRERROR=1 -DHAVE_SIGSET=1 -DHAVE_ATOLL=1 -DHAVE_UNISTD_H=1 -DHAVE_GETPAGESIZE=1 -DHAVE_MMAP=1 -DHAVE_SELECT=1 -DHAVE_POLL=1 -DHAVE_TM_GMTOFF=1 -DHAVE_INT64T=1 -DHAVE_SOCKLENT=1 -I.. -c redirect.c gcc redirect.o -lcrypt -o redirect gcc -O2 -DHAVE__PROGNAME=1 -DHAVE_FCNTL_H=1 -DHAVE_GRP_H=1 -DHAVE_MEMORY_H=1 -DHAVE_PATHS_H=1 -DHAVE_POLL_H=1 -DHAVE_SYS_POLL_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_DIRENT_H=1 -DHAVE_LIBCRYPT=1 -DHAVE_STRERROR=1 -DHAVE_WAITPID=1 -DHAVE_VSNPRINTF=1 -DHAVE_DAEMON=1 -DHAVE_SETSID=1 -DHAVE_GETADDRINFO=1 -DHAVE_GETNAMEINFO=1 -DHAVE_GAI_STRERROR=1 -DHAVE_SIGSET=1 -DHAVE_ATOLL=1 -DHAVE_UNISTD_H=1 -DHAVE_GETPAGESIZE=1 -DHAVE_MMAP=1 -DHAVE_SELECT=1 -DHAVE_POLL=1 -DHAVE_TM_GMTOFF=1 -DHAVE_INT64T=1 -DHAVE_SOCKLENT=1 -I.. -c ssi.c In file included from /usr/include/string.h:519, from ssi.c:30: In function ‘strncpy’, inlined from ‘get_filename.constprop’ at ssi.c:183:9: /usr/include/aarch64-linux-gnu/bits/string_fortified.h:95:10: warning: ‘__builtin_strncpy’ specified bound depends on the length of the source argument [-Wstringop-overflow=] 95 | return __builtin___strncpy_chk (__dest, __src, __len, | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | __glibc_objsize (__dest)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ ssi.c: In function ‘get_filename.constprop’: ssi.c:169:10: note: length computed here 169 | fl = strlen( filename ); | ^~~~~~~~~~~~~~~~~~ gcc ssi.o ../match.o -lcrypt -o ssi gcc -O2 -DHAVE__PROGNAME=1 -DHAVE_FCNTL_H=1 -DHAVE_GRP_H=1 -DHAVE_MEMORY_H=1 -DHAVE_PATHS_H=1 -DHAVE_POLL_H=1 -DHAVE_SYS_POLL_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_DIRENT_H=1 -DHAVE_LIBCRYPT=1 -DHAVE_STRERROR=1 -DHAVE_WAITPID=1 -DHAVE_VSNPRINTF=1 -DHAVE_DAEMON=1 -DHAVE_SETSID=1 -DHAVE_GETADDRINFO=1 -DHAVE_GETNAMEINFO=1 -DHAVE_GAI_STRERROR=1 -DHAVE_SIGSET=1 -DHAVE_ATOLL=1 -DHAVE_UNISTD_H=1 -DHAVE_GETPAGESIZE=1 -DHAVE_MMAP=1 -DHAVE_SELECT=1 -DHAVE_POLL=1 -DHAVE_TM_GMTOFF=1 -DHAVE_INT64T=1 -DHAVE_SOCKLENT=1 -I.. -c phf.c gcc phf.o -lcrypt -o phf make[1]: Leaving directory '/home/frank/Acme.com/thttpd-2.29/cgi-src' /home/frank/Acme.com/thttpd-2.29/extras make[1]: Entering directory '/home/frank/Acme.com/thttpd-2.29/extras' gcc -O2 -DHAVE__PROGNAME=1 -DHAVE_FCNTL_H=1 -DHAVE_GRP_H=1 -DHAVE_MEMORY_H=1 -DHAVE_PATHS_H=1 -DHAVE_POLL_H=1 -DHAVE_SYS_POLL_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_DIRENT_H=1 -DHAVE_LIBCRYPT=1 -DHAVE_STRERROR=1 -DHAVE_WAITPID=1 -DHAVE_VSNPRINTF=1 -DHAVE_DAEMON=1 -DHAVE_SETSID=1 -DHAVE_GETADDRINFO=1 -DHAVE_GETNAMEINFO=1 -DHAVE_GAI_STRERROR=1 -DHAVE_SIGSET=1 -DHAVE_ATOLL=1 -DHAVE_UNISTD_H=1 -DHAVE_GETPAGESIZE=1 -DHAVE_MMAP=1 -DHAVE_SELECT=1 -DHAVE_POLL=1 -DHAVE_TM_GMTOFF=1 -DHAVE_INT64T=1 -DHAVE_SOCKLENT=1 -I.. -DWEBDIR=\"/usr/local/www\" -c makeweb.c makeweb.c: In function ‘check_dir’: makeweb.c:97:9: warning: ignoring return value of ‘chown’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 97 | (void) chown( dirname, -1, gid ); | ^~~~~~~~~~~~~~~~~~~~~~~~~ gcc makeweb.o -o makeweb -lcrypt gcc -O2 -DHAVE__PROGNAME=1 -DHAVE_FCNTL_H=1 -DHAVE_GRP_H=1 -DHAVE_MEMORY_H=1 -DHAVE_PATHS_H=1 -DHAVE_POLL_H=1 -DHAVE_SYS_POLL_H=1 -DTIME_WITH_SYS_TIME=1 -DHAVE_DIRENT_H=1 -DHAVE_LIBCRYPT=1 -DHAVE_STRERROR=1 -DHAVE_WAITPID=1 -DHAVE_VSNPRINTF=1 -DHAVE_DAEMON=1 -DHAVE_SETSID=1 -DHAVE_GETADDRINFO=1 -DHAVE_GETNAMEINFO=1 -DHAVE_GAI_STRERROR=1 -DHAVE_SIGSET=1 -DHAVE_ATOLL=1 -DHAVE_UNISTD_H=1 -DHAVE_GETPAGESIZE=1 -DHAVE_MMAP=1 -DHAVE_SELECT=1 -DHAVE_POLL=1 -DHAVE_TM_GMTOFF=1 -DHAVE_INT64T=1 -DHAVE_SOCKLENT=1 -I.. -DWEBDIR=\"/usr/local/www\" -c htpasswd.c htpasswd.c: In function ‘main’: htpasswd.c:215:5: warning: ignoring return value of ‘system’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 215 | system(command); | ^~~~~~~~~~~~~~~ htpasswd.c: In function ‘add_password’: htpasswd.c:115:9: warning: ignoring return value of ‘fgets’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 115 | (void) fgets( pass, sizeof(pass), stdin ); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ gcc htpasswd.o -o htpasswd -lcrypt make[1]: Leaving directory '/home/frank/Acme.com/thttpd-2.29/extras' frank@frank-desktop:~/Acme.com/thttpd-2.29$ frank@frank-desktop:~/Acme.com/thttpd-2.29$ Again we completed so lets try the next step. Step #3 from "INSTALL" and we have to use "sudo" on this because the program is adding directories that are owned by "root". frank@frank-desktop:~/Acme.com/thttpd-2.29$ frank@frank-desktop:~/Acme.com/thttpd-2.29$ sudo make install [sudo] password for frank: mkdir -p /usr/local/sbin /usr/bin/install -c -m 555 -o bin -g bin thttpd /usr/local/sbin mkdir -p /usr/local/man/man8 /usr/bin/install -c -m 444 -o bin -g bin thttpd.8 /usr/local/man/man8 for i in cgi-src extras ; do ( \ cd $i ; \ pwd ; \ make \ WEBDIR=/usr/local/www \ CGIBINDIR=/usr/local/www/cgi-bin \ MANDIR=/usr/local/man \ WEBGROUP=www \ install \ ) ; done /home/frank/Acme.com/thttpd-2.29/cgi-src make[1]: Entering directory '/home/frank/Acme.com/thttpd-2.29/cgi-src' mkdir -p /usr/local/www/cgi-bin rm -f /usr/local/www/cgi-bin/redirect cp redirect /usr/local/www/cgi-bin/redirect rm -f /usr/local/man/man8/redirect.8 cp redirect.8 /usr/local/man/man8/redirect.8 rm -f /usr/local/www/cgi-bin/ssi cp ssi /usr/local/www/cgi-bin/ssi rm -f /usr/local/man/man8/ssi.8 cp ssi.8 /usr/local/man/man8/ssi.8 rm -f /usr/local/www/cgi-bin/phf cp phf /usr/local/www/cgi-bin/phf make[1]: Leaving directory '/home/frank/Acme.com/thttpd-2.29/cgi-src' /home/frank/Acme.com/thttpd-2.29/extras make[1]: Entering directory '/home/frank/Acme.com/thttpd-2.29/extras' rm -f /usr/local/sbin/makeweb /usr/local/sbin/htpasswd /usr/local/sbin/syslogtocern cp makeweb /usr/local/sbin/makeweb chgrp www /usr/local/sbin/makeweb chmod 2755 /usr/local/sbin/makeweb cp htpasswd /usr/local/sbin/htpasswd cp syslogtocern /usr/local/sbin/syslogtocern rm -f /usr/local/man/man1/makeweb.1 cp makeweb.1 /usr/local/man/man1/makeweb.1 rm -f /usr/local/man/man1/htpasswd.1 cp htpasswd.1 /usr/local/man/man1/htpasswd.1 rm -f /usr/local/man/man8/syslogtocern.8 cp syslogtocern.8 /usr/local/man/man8/syslogtocern.8 make[1]: Leaving directory '/home/frank/Acme.com/thttpd-2.29/extras' frank@frank-desktop:~/Acme.com/thttpd-2.29$ frank@frank-desktop:~/Acme.com/thttpd-2.29$ ************** "thttpd" is now installed. The next thing is to add directories "logs" and "users" to the "www" directory. frank@frank-desktop:~/Acme.com/thttpd-2.29$ frank@frank-desktop:~/Acme.com/thttpd-2.29$ cd /usr/local/www frank@frank-desktop:/usr/local/www$ frank@frank-desktop:/usr/local/www$ ls -al total 12 drwxr-xr-x 3 root root 4096 May 26 14:11 . drwxr-xr-x 11 root root 4096 May 26 14:11 .. drwxr-xr-x 2 root root 4096 May 26 14:11 cgi-bin frank@frank-desktop:/usr/local/www$ frank@frank-desktop:/usr/local/www$ frank@frank-desktop:/usr/local/www$ sudo mkdir logs users frank@frank-desktop:/usr/local/www$ ls -al total 20 drwxr-xr-x 5 root root 4096 May 26 14:18 . drwxr-xr-x 11 root root 4096 May 26 14:11 .. drwxr-xr-x 2 root root 4096 May 26 14:11 cgi-bin drwxr-xr-x 2 root root 4096 May 26 14:18 logs drwxr-xr-x 2 root root 4096 May 26 14:18 users frank@frank-desktop:/usr/local/www$ ****************** Now we go back one level so we can change the owner and group on everything in the "www" directory from "root:root" to "root:www". frank@frank-desktop:/usr/local/www$ frank@frank-desktop:/usr/local/www$ cd .. frank@frank-desktop:/usr/local$ frank@frank-desktop:/usr/local$ frank@frank-desktop:/usr/local$ sudo chown -vR root:www www changed ownership of 'www/users' from root:root to root:www changed ownership of 'www/cgi-bin/ssi' from root:root to root:www changed ownership of 'www/cgi-bin/redirect' from root:root to root:www changed ownership of 'www/cgi-bin/phf' from root:root to root:www changed ownership of 'www/cgi-bin' from root:root to root:www changed ownership of 'www/logs' from root:root to root:www changed ownership of 'www' from root:root to root:www frank@frank-desktop:/usr/local$ frank@frank-desktop:/usr/local$ frank@frank-desktop:/usr/local$ cd www frank@frank-desktop:/usr/local/www$ ls -al total 20 drwxr-xr-x 5 root www 4096 May 26 14:18 . drwxr-xr-x 11 root root 4096 May 26 14:11 .. drwxr-xr-x 2 root www 4096 May 26 14:11 cgi-bin drwxr-xr-x 2 root www 4096 May 26 14:18 logs drwxr-xr-x 2 root www 4096 May 26 14:18 users frank@frank-desktop:/usr/local/www$ ********* We need this! Now we need to change the permissions on "users" so those in the "www" group can write to this directory! frank@frank-desktop:/usr/local/www$ frank@frank-desktop:/usr/local/www$ sudo chmod -v 0775 users mode of 'users' changed from 0755 (rwxr-xr-x) to 0775 (rwxrwxr-x) frank@frank-desktop:/usr/local/www$ ls -al total 20 drwxr-xr-x 5 root www 4096 May 26 14:18 . drwxr-xr-x 11 root root 4096 May 26 14:11 .. drwxr-xr-x 2 root www 4096 May 26 14:11 cgi-bin drwxr-xr-x 2 root www 4096 May 26 14:18 logs drwxrwxr-x 2 root www 4096 May 26 14:18 users frank@frank-desktop:/usr/local/www$ *********** We now change back to the "(frank)" home directory and are going to add a "user" that belongs in the "www" group, from the help on "adduser" we see what we have to type. frank@frank-desktop:/usr/local/www$ frank@frank-desktop:/usr/local/www$ cd frank@frank-desktop:~$ frank@frank-desktop:~$ addgroup --help adduser [--home DIR] [--shell SHELL] [--no-create-home] [--uid ID] [--firstuid ID] [--lastuid ID] [--gecos GECOS] [--ingroup GROUP | --gid ID] [--disabled-password] [--disabled-login] [--add_extra_groups] [--encrypt-home] USER Add a normal user adduser --system [--home DIR] [--shell SHELL] [--no-create-home] [--uid ID] [--gecos GECOS] [--group | --ingroup GROUP | --gid ID] [--disabled-password] [--disabled-login] [--add_extra_groups] USER Add a system user adduser --group [--gid ID] GROUP addgroup [--gid ID] GROUP Add a user group addgroup --system [--gid ID] GROUP Add a system group adduser USER GROUP Add an existing user to an existing group general options: --quiet | -q don't give process information to stdout --force-badname allow usernames which do not match the NAME_REGEX[_SYSTEM] configuration variable --extrausers uses extra users as the database --help | -h usage message --version | -v version number and copyright --conf | -c FILE use FILE as configuration file frank@frank-desktop:~$ ******** frank@frank-desktop:~$ For an example, I will add "ac0xl", my ham radio call sign, as a user for my website. One can think of these as different tabs or categories on your website. Use a different password for these "users" than the one you use for "(frank)" for more security. The information it asks for was for the "finger" program which most computers don't run for security reasons. I usually just use the "user" for the name and leave the rest blank. (This time I will use my real data.) frank@frank-desktop:~$ frank@frank-desktop:~$ sudo adduser --add_extra_groups ac0xl Adding user `ac0xl' ... Adding new group `ac0xl' (1001) ... Adding new user `ac0xl' (1001) with group `ac0xl' ... Creating home directory `/home/ac0xl' ... Copying files from `/etc/skel' ... New password: Retype new password: passwd: password updated successfully Changing the user information for ac0xl Enter the new value, or press ENTER for the default Full Name []: Frank Anderson Room Number []: 651 N Broadway Work Phone []: 435-210-0710 Home Phone []: 970-424-1451 Other []: Green River UT 84525-0615 Is the information correct? [Y/n] y Adding new user `ac0xl' to extra groups ... Adding user `ac0xl' to group `dialout' ... Adding user `ac0xl' to group `cdrom' ... Adding user `ac0xl' to group `floppy' ... Adding user `ac0xl' to group `audio' ... Adding user `ac0xl' to group `video' ... Adding user `ac0xl' to group `plugdev' ... Adding user `ac0xl' to group `users' ... frank@frank-desktop:~$ frank@frank-desktop:~$ frank@frank-desktop:~$ frank@frank-desktop:~$ cat /etc/group root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog,frank tty:x:5: disk:x:6: lp:x:7: mail:x:8: news:x:9: uucp:x:10: man:x:12: proxy:x:13: kmem:x:15: dialout:x:20:ac0xl fax:x:21: voice:x:22: cdrom:x:24:frank,ac0xl floppy:x:25:ac0xl tape:x:26: sudo:x:27:frank audio:x:29:pulse,ac0xl dip:x:30:frank www-data:x:33: backup:x:34: operator:x:37: list:x:38: irc:x:39: src:x:40: gnats:x:41: shadow:x:42: utmp:x:43: video:x:44:ac0xl sasl:x:45: plugdev:x:46:frank,ac0xl staff:x:50: games:x:60: users:x:100:ac0xl nogroup:x:65534: systemd-journal:x:101: systemd-network:x:102: systemd-resolve:x:103: systemd-timesync:x:104: crontab:x:105: messagebus:x:106: input:x:107: kvm:x:108: render:x:109: syslog:x:110: tss:x:111: bluetooth:x:112: ssl-cert:x:113: uuidd:x:114: tcpdump:x:115: ssh:x:116: avahi-autoipd:x:117: rdma:x:118: rtkit:x:119: netdev:x:120: avahi:x:121: lpadmin:x:122:frank nm-openvpn:x:123: whoopsie:x:124: sssd:x:125: scanner:x:126:saned saned:x:127: colord:x:128: geoclue:x:129: pulse:x:130: pulse-access:x:131: gdm:x:132: lxd:x:133:frank systemd-coredump:x:999: frank:x:1000: sambashare:x:134:frank www:x:135:frank ac0xl:x:1001: frank@frank-desktop:~$ frank@frank-desktop:~$ adduser USER GROUP Add an existing user to an existing group frank@frank-desktop:~$ frank@frank-desktop:~$ sudo adduser ac0xl www Adding user `ac0xl' to group `www' ... Adding user ac0xl to group www Done. frank@frank-desktop:~$ frank@frank-desktop:~$ frank@frank-desktop:~$ cat /etc/group root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog,frank tty:x:5: disk:x:6: lp:x:7: mail:x:8: news:x:9: uucp:x:10: man:x:12: proxy:x:13: kmem:x:15: dialout:x:20:ac0xl fax:x:21: voice:x:22: cdrom:x:24:frank,ac0xl floppy:x:25:ac0xl tape:x:26: sudo:x:27:frank audio:x:29:pulse,ac0xl dip:x:30:frank www-data:x:33: backup:x:34: operator:x:37: list:x:38: irc:x:39: src:x:40: gnats:x:41: shadow:x:42: utmp:x:43: video:x:44:ac0xl sasl:x:45: plugdev:x:46:frank,ac0xl staff:x:50: games:x:60: users:x:100:ac0xl nogroup:x:65534: systemd-journal:x:101: systemd-network:x:102: systemd-resolve:x:103: systemd-timesync:x:104: crontab:x:105: messagebus:x:106: input:x:107: kvm:x:108: render:x:109: syslog:x:110: tss:x:111: bluetooth:x:112: ssl-cert:x:113: uuidd:x:114: tcpdump:x:115: ssh:x:116: avahi-autoipd:x:117: rdma:x:118: rtkit:x:119: netdev:x:120: avahi:x:121: lpadmin:x:122:frank nm-openvpn:x:123: whoopsie:x:124: sssd:x:125: scanner:x:126:saned saned:x:127: colord:x:128: geoclue:x:129: pulse:x:130: pulse-access:x:131: gdm:x:132: lxd:x:133:frank systemd-coredump:x:999: frank:x:1000: sambashare:x:134:frank www:x:135:frank,ac0xl ac0xl:x:1001: frank@frank-desktop:~$ frank@frank-desktop:~$ ************** frank@frank-desktop:~$ frank@frank-desktop:~$ cd /home frank@frank-desktop:/home$ ls -al total 16 drwxr-xr-x 4 root root 4096 May 27 16:02 . drwxr-xr-x 20 root root 4096 Apr 21 18:13 .. drwxr-x--- 2 ac0xl ac0xl 4096 May 27 16:02 ac0xl drwxr-x--- 21 frank frank 4096 May 27 13:04 frank frank@frank-desktop:/home$ frank@frank-desktop:/home$ frank@frank-desktop:/home$ su ac0xl # we have to change to user "(ac0xl)" Password: ac0xl@frank-desktop:/home$ cd # here we are still in "/home" ac0xl@frank-desktop:~$ ls -al # we are now in "(ac0xl)" total 20 drwxr-x--- 2 ac0xl ac0xl 4096 May 27 16:02 . drwxr-xr-x 4 root root 4096 May 27 16:02 .. -rw-r--r-- 1 ac0xl ac0xl 220 May 27 16:02 .bash_logout -rw-r--r-- 1 ac0xl ac0xl 3771 May 27 16:02 .bashrc -rw-r--r-- 1 ac0xl ac0xl 807 May 27 16:02 .profile ac0xl@frank-desktop:~$ # if makeweb does not work (no permission) did you?: sudo chown -v 0775 /usr/local/www/users #? ac0xl@frank-desktop:~$ makeweb Created web directory /usr/local/www/users/ac0xl Created symbolic link /home/ac0xl/public_html ac0xl@frank-desktop:~$ ac0xl@frank-desktop:~$ ls -al total 20 drwxr-x--- 2 ac0xl ac0xl 4096 May 27 16:18 . drwxr-xr-x 4 root root 4096 May 27 16:02 .. -rw-r--r-- 1 ac0xl ac0xl 220 May 27 16:02 .bash_logout -rw-r--r-- 1 ac0xl ac0xl 3771 May 27 16:02 .bashrc -rw-r--r-- 1 ac0xl ac0xl 807 May 27 16:02 .profile lrwxrwxrwx 1 ac0xl www 26 May 27 16:18 public_html -> /usr/local/www/users/ac0xl ac0xl@frank-desktop:~$ ac0xl@frank-desktop:~$ ac0xl@frank-desktop:~$ exit # changing to (frank) exit frank@frank-desktop:/home$ frank@frank-desktop:/home$ cd /usr/local/www/users frank@frank-desktop:/usr/local/www/users$ ls -al total 12 drwxrwxr-x 3 root www 4096 May 27 16:18 . drwxr-xr-x 5 root www 4096 May 26 14:18 .. drwxr-xr-x 2 ac0xl ac0xl 4096 May 27 16:18 ac0xl frank@frank-desktop:/usr/local/www/users$ frank@frank-desktop:/usr/local/www/users$ cd ac0xl frank@frank-desktop:/usr/local/www/users/ac0xl$ ls -al total 8 drwxr-xr-x 2 ac0xl ac0xl 4096 May 27 16:18 . drwxrwxr-x 3 root www 4096 May 27 16:18 .. frank@frank-desktop:/usr/local/www/users/ac0xl$ So far so good! We now have a main www user installed. Other ideas for web "users" could be: documents, downloads, games, memes, music, notices, pictures, videos, etc., just categories of what you want on your website, or what you want to share. This time we will use a different process to add only www users. frank@frank-desktop:~$ addgroup --help adduser [--home DIR] [--shell SHELL] [--no-create-home] [--uid ID] [--firstuid ID] [--lastuid ID] [--gecos GECOS] [--ingroup GROUP | --gid ID] [--disabled-password] [--disabled-login] [--add_extra_groups] [--encrypt-home] USER Add a normal user Again the process: sudo adduser --ingroup www videos # (new web user "videos") (use a password that is different from the one for "(frank)") su videos # (shell to user "videos") makeweb exit # (exit the shell back to where you were) ******************** Lets try adding "documents". frank@frank-desktop:~$ frank@frank-desktop:~$ sudo adduser --ingroup www documents [sudo] password for frank: Adding user `documents' ... Adding new user `documents' (1002) with group `www' ... Creating home directory `/home/documents' ... Copying files from `/etc/skel' ... New password: BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word Retype new password: passwd: password updated successfully Changing the user information for documents Enter the new value, or press ENTER for the default Full Name []: documents Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] y frank@frank-desktop:~$ frank@frank-desktop:~$ frank@frank-desktop:~$ frank@frank-desktop:~$ ls -al /home total 20 drwxr-xr-x 5 root root 4096 May 28 16:33 . drwxr-xr-x 20 root root 4096 Apr 21 18:13 .. drwxr-x--- 2 ac0xl ac0xl 4096 May 27 16:52 ac0xl drwxr-x--- 2 documents www 4096 May 28 16:39 documents drwxr-x--- 21 frank frank 4096 May 27 13:04 frank frank@frank-desktop:~$ frank@frank-desktop:~$ frank@frank-desktop:~$ su documents Password: documents@frank-desktop:/home/frank$ documents@frank-desktop:/home/frank$ cd # changing into the directory: /home/documents, since we are now user "documents". documents@frank-desktop:~$ ls -al total 20 drwxr-x--- 2 documents www 4096 May 28 16:33 . drwxr-xr-x 5 root root 4096 May 28 16:33 .. -rw-r--r-- 1 documents www 220 May 28 16:33 .bash_logout -rw-r--r-- 1 documents www 3771 May 28 16:33 .bashrc -rw-r--r-- 1 documents www 807 May 28 16:33 .profile documents@frank-desktop:~$ documents@frank-desktop:~$ makeweb Created web directory /usr/local/www/users/documents Created symbolic link /home/documents/public_html documents@frank-desktop:~$ documents@frank-desktop:~$ ls -al total 20 drwxr-x--- 2 documents www 4096 May 28 16:37 . drwxr-xr-x 5 root root 4096 May 28 16:33 .. -rw-r--r-- 1 documents www 220 May 28 16:33 .bash_logout -rw-r--r-- 1 documents www 3771 May 28 16:33 .bashrc -rw-r--r-- 1 documents www 807 May 28 16:33 .profile lrwxrwxrwx 1 documents www 30 May 28 16:37 public_html -> /usr/local/www/users/documents documents@frank-desktop:~$ exit # (exit the shell back to where you were) exit frank@frank-desktop:~$ frank@frank-desktop:~$ cat /etc/group root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog,frank tty:x:5: disk:x:6: lp:x:7: mail:x:8: news:x:9: uucp:x:10: man:x:12: proxy:x:13: kmem:x:15: dialout:x:20:ac0xl fax:x:21: voice:x:22: cdrom:x:24:frank,ac0xl floppy:x:25:ac0xl tape:x:26: sudo:x:27:frank audio:x:29:pulse,ac0xl dip:x:30:frank www-data:x:33: backup:x:34: operator:x:37: list:x:38: irc:x:39: src:x:40: gnats:x:41: shadow:x:42: utmp:x:43: video:x:44:ac0xl sasl:x:45: plugdev:x:46:frank,ac0xl staff:x:50: games:x:60: users:x:100:ac0xl nogroup:x:65534: systemd-journal:x:101: systemd-network:x:102: systemd-resolve:x:103: systemd-timesync:x:104: crontab:x:105: messagebus:x:106: input:x:107: kvm:x:108: render:x:109: syslog:x:110: tss:x:111: bluetooth:x:112: ssl-cert:x:113: uuidd:x:114: tcpdump:x:115: ssh:x:116: avahi-autoipd:x:117: rdma:x:118: rtkit:x:119: netdev:x:120: avahi:x:121: lpadmin:x:122:frank nm-openvpn:x:123: whoopsie:x:124: sssd:x:125: scanner:x:126:saned saned:x:127: colord:x:128: geoclue:x:129: pulse:x:130: pulse-access:x:131: gdm:x:132: lxd:x:133:frank systemd-coredump:x:999: frank:x:1000: sambashare:x:134:frank www:x:135:frank,ac0xl ac0xl:x:1001: frank@frank-desktop:~$ frank@frank-desktop:~$ frank@frank-desktop:~$ ls -al /usr/local/www/users total 16 drwxrwxr-x 4 root www 4096 May 28 16:37 . drwxr-xr-x 5 root www 4096 May 26 14:18 .. drwxr-xr-x 2 ac0xl ac0xl 4096 May 27 16:18 ac0xl drwxr-xr-x 2 documents www 4096 May 28 16:37 documents frank@frank-desktop:~$ frank@frank-desktop:~$ From all of this we can see "documents" is owned by "documents" and is in group "www", but does not show in the "www:x:135:" group. From adduser "Adding new user `documents' (1002) with group `www' ..." . We also do not see user (1002) listed in "/etc/group". This is all OK. ********* I liked the "anvil_thttpd.gif" on the Acme.com website and chose it as my favicon.ico by renaming a copy to favicon.ico. An "anvil" is built to be hammered on without failing, and "thttpd" is built to take a hammering without failing. It is bullet proof! When you look at your logs you will see how "thttpd" will block all sorts of attempts to break your website! You will also get an idea of things to avoid on your website. frank@frank-desktop:~$ frank@frank-desktop:~$ cd /usr/local/sbin frank@frank-desktop:/usr/local/sbin$ ls -al total 172 drwxr-xr-x 2 root root 4096 May 27 15:39 . drwxr-xr-x 11 root root 4096 May 26 14:11 .. -rwxr-xr-x 1 root root 19048 May 27 15:39 htpasswd -rwxr-sr-x 1 root www 14184 May 27 15:39 makeweb -r-xr-xr-x 1 root root 2878 May 27 15:39 syslogtocern -r-xr-xr-x 1 bin bin 124560 May 27 15:39 thttpd frank@frank-desktop:/usr/local/sbin$ frank@frank-desktop:/usr/local/sbin$ cd ~/freedom # (The directory "freedom" should be in "/home/(frank)/"). frank@frank-desktop:~/freedom$ frank@frank-desktop:~/freedom$ ls -al total 308 drwxr-xr-x 3 frank frank 4096 May 28 17:09 . drwxr-x--- 21 frank frank 4096 May 27 13:04 .. -rw-r--r-- 1 frank frank 32014 Jan 8 2020 2010Website.pdf -rw-r--r-- 1 frank frank 11024 Jan 8 2020 2019-09-05-Project.txt -rw-r--r-- 1 frank frank 11941 Jan 8 2020 2019-10-01-website.txt -rw-r--r-- 1 frank frank 6365 Jan 8 2020 2019-11-26-web-server.txt -rw-r--r-- 1 frank frank 21340 Jan 8 2020 2019-12-06-Google-Search-Is-Broken.txt -rw-r--r-- 1 frank frank 77314 May 28 17:09 2019-12-26-Installing-thttpd.txt -rw-r--r-- 1 frank frank 12787 Mar 18 19:17 2020-07-17-thttpd.txt -rw-rw-r-- 1 frank frank 64700 May 28 17:02 2021-05-14-Install-thttpd-Pi-400-ubuntu-21.04-desktop-arm64+raspi.txt -rw-r--r-- 1 frank frank 32787 Mar 18 19:18 readme.txt -rw-r--r-- 1 frank frank 186 Jan 8 2020 sitemap.xml -rw-r--r-- 1 frank frank 186 Jan 8 2020 sitemap.xml.txt -rw-r--r-- 1 frank frank 456 Jan 8 2020 thttpd_config -rw-r--r-- 1 frank frank 456 Jan 8 2020 thttpd_config~ drwxr-xr-x 2 frank frank 4096 Jan 8 2020 thttpd-extras frank@frank-desktop:~/freedom$ frank@frank-desktop:~/freedom$ sudo cp -rv thttpd-extras /usr/local/sbin/ [sudo] password for frank: 'thttpd-extras' -> '/usr/local/sbin/thttpd-extras' 'thttpd-extras/thttpd.sh' -> '/usr/local/sbin/thttpd-extras/thttpd.sh' 'thttpd-extras/thttpd_wrapper' -> '/usr/local/sbin/thttpd-extras/thttpd_wrapper' 'thttpd-extras/thttpd-rotate' -> '/usr/local/sbin/thttpd-extras/thttpd-rotate' 'thttpd-extras/readme.txt' -> '/usr/local/sbin/thttpd-extras/readme.txt' 'thttpd-extras/robots.txt' -> '/usr/local/sbin/thttpd-extras/robots.txt' 'thttpd-extras/thttpd_config~' -> '/usr/local/sbin/thttpd-extras/thttpd_config~' 'thttpd-extras/anvil_thttpd.gif' -> '/usr/local/sbin/thttpd-extras/anvil_thttpd.gif' 'thttpd-extras/favicon.ico' -> '/usr/local/sbin/thttpd-extras/favicon.ico' 'thttpd-extras/thttpd_config' -> '/usr/local/sbin/thttpd-extras/thttpd_config' 'thttpd-extras/rc.local' -> '/usr/local/sbin/thttpd-extras/rc.local' 'thttpd-extras/sitemap.xml' -> '/usr/local/sbin/thttpd-extras/sitemap.xml' 'thttpd-extras/robots-site.txt' -> '/usr/local/sbin/thttpd-extras/robots-site.txt' 'thttpd-extras/sitemap.xml.txt' -> '/usr/local/sbin/thttpd-extras/sitemap.xml.txt' frank@frank-desktop:~/freedom$ frank@frank-desktop:~/freedom$ frank@frank-desktop:~/freedom$ sudo cp -rv os-debug /usr/local/sbin/ 'os-debug' -> '/usr/local/sbin/os-debug' 'os-debug/thttpd-rotate' -> '/usr/local/sbin/os-debug/thttpd-rotate' 'os-debug/thttpd_wrapper' -> '/usr/local/sbin/os-debug/thttpd_wrapper' 'os-debug/dead-thttpd' -> '/usr/local/sbin/os-debug/dead-thttpd' 'os-debug/datelog' -> '/usr/local/sbin/os-debug/datelog' frank@frank-desktop:~/freedom$ frank@frank-desktop:~/freedom$ frank@frank-desktop:~/freedom$ cd /usr/local/sbin/thttpd-extras frank@frank-desktop:/usr/local/sbin/thttpd-extras$ ls -al total 60 drwxr-xr-x 2 root root 4096 May 28 17:11 . drwxr-xr-x 3 root root 4096 May 28 17:11 .. -rw-r--r-- 1 root root 533 May 28 17:11 anvil_thttpd.gif -rw-r--r-- 1 root root 533 May 28 17:11 favicon.ico -rw-r--r-- 1 root root 485 May 28 17:11 rc.local -rw-r--r-- 1 root root 247 May 28 17:11 readme.txt -rw-r--r-- 1 root root 73 May 28 17:11 robots-site.txt -rw-r--r-- 1 root root 27 May 28 17:11 robots.txt -rw-r--r-- 1 root root 186 May 28 17:11 sitemap.xml -rw-r--r-- 1 root root 186 May 28 17:11 sitemap.xml.txt -rw-r--r-- 1 root root 456 May 28 17:11 thttpd_config -rw-r--r-- 1 root root 456 May 28 17:11 thttpd_config~ -rw-r--r-- 1 root root 1745 May 28 17:11 thttpd-rotate -rw-r--r-- 1 root root 136 May 28 17:11 thttpd.sh -rw-r--r-- 1 root root 120 May 28 17:11 thttpd_wrapper frank@frank-desktop:/usr/local/sbin/thttpd-extras$ The files: rc.local, and thttpd* files are all program files that have to execute so we need to change their privileges to "0755", the other files are data files and are "0644". frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ sudo chmod -v 0755 rc.local mode of 'rc.local' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x) frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ sudo chmod -v 0755 thttpd* mode of 'thttpd_config' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x) mode of 'thttpd_config~' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x) mode of 'thttpd-rotate' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x) mode of 'thttpd.sh' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x) mode of 'thttpd_wrapper' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x) frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ ls -al total 60 drwxr-xr-x 2 root root 4096 May 28 17:11 . drwxr-xr-x 3 root root 4096 May 28 17:11 .. -rw-r--r-- 1 root root 533 May 28 17:11 anvil_thttpd.gif -rw-r--r-- 1 root root 533 May 28 17:11 favicon.ico -rwxr-xr-x 1 root root 485 May 28 17:11 rc.local -rw-r--r-- 1 root root 247 May 28 17:11 readme.txt -rw-r--r-- 1 root root 73 May 28 17:11 robots-site.txt -rw-r--r-- 1 root root 27 May 28 17:11 robots.txt -rw-r--r-- 1 root root 186 May 28 17:11 sitemap.xml -rw-r--r-- 1 root root 186 May 28 17:11 sitemap.xml.txt -rwxr-xr-x 1 root root 456 May 28 17:11 thttpd_config -rwxr-xr-x 1 root root 456 May 28 17:11 thttpd_config~ -rwxr-xr-x 1 root root 1745 May 28 17:11 thttpd-rotate -rwxr-xr-x 1 root root 136 May 28 17:11 thttpd.sh -rwxr-xr-x 1 root root 120 May 28 17:11 thttpd_wrapper frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ cat /etc/rc.local cat: /etc/rc.local: No such file or directory rc.local is a file that is part of "systemd" which is in "/etc". frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ cat rc.local #!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. # Print the IP address _IP=$(hostname -I) || true if [ "$_IP" ]; then printf "My IP address is %s\n" "$_IP" fi # Start thttpd echo "Starting thttpd. \n" . /etc/thttpd.sh # exit 0 frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ sudo cp -iav rc.local /etc/rc.local 'rc.local' -> '/etc/rc.local' frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ ls -l /etc/rc.local -rwxr-xr-x 1 root root 485 May 28 17:11 /etc/rc.local (rc.local is still 0755) frank@frank-desktop:/usr/local/sbin/thttpd-extras$ We now need to copy thttpd.sh to /etc and make sure it is 0755. frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ sudo cp -iav thttpd.sh /etc/ 'thttpd.sh' -> '/etc/thttpd.sh' frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ ls -l /etc/thttpd.sh -rwxr-xr-x 1 root root 136 May 28 17:11 /etc/thttpd.sh frank@frank-desktop:/usr/local/sbin/thttpd-extras$ (thttpd.sh is still 0755) frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ cat thttpd.sh #!/bin/sh # thttpd.sh if [ -x /usr/local/sbin/thttpd_wrapper ] ; then echo -n " thttpd" /usr/local/sbin/thttpd_wrapper & fi # exit 0 frank@frank-desktop:/usr/local/sbin/thttpd-extras$ thttpd.sh is looking for thttpd_wrapper to be in "/usr/local/sbin/" and being 0755, so we will copy "thttpd_wrapper" up one level to there. frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ sudo cp -iav thttpd_wrapper ../ 'thttpd_wrapper' -> '../thttpd_wrapper' frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ ls -l /usr/local/sbin total 172 -rwxr-xr-x 1 root root 19048 May 27 15:39 htpasswd -rwxr-sr-x 1 root www 14184 May 27 15:39 makeweb -r-xr-xr-x 1 root root 2878 May 27 15:39 syslogtocern -r-xr-xr-x 1 bin bin 124560 May 27 15:39 thttpd drwxr-xr-x 2 root root 4096 May 28 17:11 thttpd-extras -rwxr-xr-x 1 root root 120 May 28 17:11 thttpd_wrapper frank@frank-desktop:/usr/local/sbin/thttpd-extras$ (thttpd_wrapper is still 0755) frank@frank-desktop:/usr/local/sbin/thttpd-extras$ The purpose of this file is to restart "thttpd" if it stops and it checks every 10 seconds to see if "/usr/local/sbin/thttpd" is running and it also loads the configuration file that is "/usr/local/www/thttpd_config". If one changes the config file, one only has to kill the "thttpd pid number" and the wrapper will restart it in 10 seconds with the new configuration. "sudo kill xxxx" will kill a program. To get all of the running "pid" numbers use "ps -e". If you forget to use "sudo" to manually start "thttpd" or even "rc.local" every 10 seconds you will get a message that "/usr/local/www/logs/thttpd_log" can not be written to! (because it is now owned by nobody). What appears on your screen is not what you type in, but both the error message and what you type in. Type in "ps -e" and look for the number for "thttpd_wrapper" and then type in "sudo kill xxxx" with "xxxx" being the "pid" number. Been there, done that way too many times! frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ cat thttpd_wrapper #!/bin/sh # thttpd_wrapper while true ; do /usr/local/sbin/thttpd -D -C /usr/local/www/thttpd_config sleep 10 done # frank@frank-desktop:/usr/local/sbin/thttpd-extras$ Next "thttpd-rotate" needs to be moved to "/etc/cron.daily/" so our log files get moved every day. The time they get rotated is in "/etc/crontab" frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ cat /etc/crontab # /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh # You can also override PATH, by default, newer versions inherit it from the environment #PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) # frank@frank-desktop:/usr/local/sbin/thttpd-extras$ Here we see /etc/cron.daily is started at 06:25 in the morning. frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ sudo cp -iav thttpd-rotate /etc/cron.daily/ 'thttpd-rotate' -> '/etc/cron.daily/thttpd-rotate' frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ ls -al /etc/cron.daily total 48 drwxr-xr-x 2 root root 4096 May 28 18:01 . drwxr-xr-x 133 root root 8192 May 28 17:44 .. -rwxr-xr-x 1 root root 311 Mar 15 09:58 0anacron -rwxr-xr-x 1 root root 376 Mar 24 08:58 apport -rwxr-xr-x 1 root root 1478 Apr 13 09:53 apt-compat -rwxr-xr-x 1 root root 384 Nov 19 2019 cracklib-runtime -rwxr-xr-x 1 root root 1298 Jan 29 23:09 dpkg -rwxr-xr-x 1 root root 377 Feb 9 14:50 logrotate -rwxr-xr-x 1 root root 1123 Feb 19 03:14 man-db -rw-r--r-- 1 root root 102 Mar 15 08:10 .placeholder -rwxr-xr-x 1 root root 1745 May 28 17:11 thttpd-rotate frank@frank-desktop:/usr/local/sbin/thttpd-extras$ (thttpd_rotate is still 0755) The "thttpd_rotate" file I made is for 50 days so you don't have to move them every day, week, or even month. I also put a header and a tail on the files when they rotate so you have an idea how long your website has been up. frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ cat thttpd-rotate #!/bin/sh # /etc/cron.daily/thttpd-rotate cd /usr/local/www/logs rm -f thttpd_log.50 mv thttpd_log.49 thttpd_log.50 mv thttpd_log.48 thttpd_log.49 mv thttpd_log.47 thttpd_log.48 mv thttpd_log.46 thttpd_log.47 mv thttpd_log.45 thttpd_log.46 mv thttpd_log.44 thttpd_log.45 mv thttpd_log.43 thttpd_log.44 mv thttpd_log.42 thttpd_log.43 mv thttpd_log.41 thttpd_log.42 mv thttpd_log.40 thttpd_log.41 mv thttpd_log.39 thttpd_log.40 mv thttpd_log.38 thttpd_log.39 mv thttpd_log.37 thttpd_log.38 mv thttpd_log.36 thttpd_log.37 mv thttpd_log.35 thttpd_log.36 mv thttpd_log.34 thttpd_log.35 mv thttpd_log.33 thttpd_log.34 mv thttpd_log.32 thttpd_log.33 mv thttpd_log.31 thttpd_log.32 mv thttpd_log.30 thttpd_log.31 mv thttpd_log.29 thttpd_log.30 mv thttpd_log.28 thttpd_log.29 mv thttpd_log.27 thttpd_log.28 mv thttpd_log.26 thttpd_log.27 mv thttpd_log.25 thttpd_log.26 mv thttpd_log.24 thttpd_log.25 mv thttpd_log.23 thttpd_log.24 mv thttpd_log.22 thttpd_log.23 mv thttpd_log.21 thttpd_log.22 mv thttpd_log.20 thttpd_log.21 mv thttpd_log.19 thttpd_log.20 mv thttpd_log.18 thttpd_log.19 mv thttpd_log.17 thttpd_log.18 mv thttpd_log.16 thttpd_log.17 mv thttpd_log.15 thttpd_log.16 mv thttpd_log.14 thttpd_log.15 mv thttpd_log.13 thttpd_log.14 mv thttpd_log.12 thttpd_log.13 mv thttpd_log.11 thttpd_log.12 mv thttpd_log.10 thttpd_log.11 mv thttpd_log.09 thttpd_log.10 mv thttpd_log.08 thttpd_log.09 mv thttpd_log.07 thttpd_log.08 mv thttpd_log.06 thttpd_log.07 mv thttpd_log.05 thttpd_log.06 mv thttpd_log.04 thttpd_log.05 mv thttpd_log.03 thttpd_log.04 mv thttpd_log.02 thttpd_log.03 mv thttpd_log.01 thttpd_log.02 date >> thttpd_log w >> thttpd_log mv thttpd_log thttpd_log.01 date > thttpd_log w >> thttpd_log kill -usr1 `cat /var/run/thttpd.pid` # frank@frank-desktop:/usr/local/sbin/thttpd-extras$ ********* To copy the log files to dates, I "cd /usr/local/www/logs/" and then type ls -al to get a listing of the files and the dates for the files. Then to copy the files: "sudo cp -iv *log.xx 2020.01.01" with xx being the log number and then year.mo.da and then check that I have everything right before I press the enter key. Since the log files belong to nobody and nogroup one has to use "sudo" and "cp -iv" so root can then change the owner to something else. Example: sudo cp -iv *log.xx year.mo.da # (one can use ? to replace one character, or * to replace the rest of the string for all matching files). ls -al sudo chown -v ac0xl:www year.mo.da # the owner:group changes from root:root to ac0xl:www ls -al su ac0xl cd cd logs/ ls cp -iv /usr/local/www/logs/year.mo.da . # which will copy the files into the log file. ls -al cp -iv /usr/local/www/logs/year.mo.da ../public*/logs/ # to put the log files live on the www. They will be under "ac0xl/logs/". I posted the logs to my site just so one could see what to expect from activity on the Internet and how "thttpd" handles those interactions. The last files to copy will be the "thttpd_config" files which go to "/usr/local/www/". ******* frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ sudo cp -iav thttpd_config* /usr/local/www/ 'thttpd_config' -> '/usr/local/www/thttpd_config' 'thttpd_config~' -> '/usr/local/www/thttpd_config~' frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ ls -al /usr/local/www/ total 28 drwxr-xr-x 5 root www 4096 May 28 18:10 . drwxr-xr-x 11 root root 4096 May 26 14:11 .. drwxr-xr-x 2 root www 4096 May 27 15:39 cgi-bin drwxr-xr-x 2 root www 4096 May 26 14:18 logs -rwxr-xr-x 1 root root 456 May 28 17:11 thttpd_config -rwxr-xr-x 1 root root 456 May 28 17:11 thttpd_config~ drwxrwxr-x 4 root www 4096 May 28 16:37 users frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ cat thttpd_config # /usr/local/www/thttpd_config dir=/usr/local/www chroot #chroot jail data_dir=users #vhost # if you use a domain name you will have to uncomment (remove the # at the beginning) and then make a "user" directory using your external IPv4 address (xxx.xxx.xxx.xxx) and inside this directory make symbolic links back up to your other files in "users" (../"user-name"). cgipat=**.cgi logfile=/usr/local/www/logs/thttpd_log pidfile=/var/run/thttpd.pid # frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ cd frank@frank-desktop:~$ TESTING: We need the line from thttpd_wrapper without the wrapper. frank@frank-desktop:/usr/local/sbin$ frank@frank-desktop:/usr/local/sbin$ cat thttpd_wrapper #!/bin/sh # thttpd_wrapper while true ; do /usr/local/sbin/thttpd -D -C /usr/local/www/thttpd_config sleep 10 done # frank@frank-desktop:/usr/local/sbin$ frank@frank-desktop:/usr/local/sbin$ frank@frank-desktop:/usr/local/sbin$ cd frank@frank-desktop:~$ frank@frank-desktop:~$ frank@frank-desktop:~$ sudo /usr/local/sbin/thttpd -D -C /usr/local/www/thttpd_config At this point the terminal is still in use by thttpd. Opening a new terminal we see the pid number is: 11330. frank@frank-desktop:~$ ps -e PID TTY TIME CMD 1 ? 00:00:14 systemd 2 ? 00:00:00 kthreadd 3 ? 00:00:00 rcu_gp 4 ? 00:00:00 rcu_par_gp 8 ? 00:00:00 mm_percpu_wq 9 ? 00:00:00 rcu_tasks_kthre 10 ? 00:00:00 rcu_tasks_rude_ 11 ? 00:00:00 rcu_tasks_trace 12 ? 00:00:02 ksoftirqd/0 13 ? 00:00:13 rcu_preempt 14 ? 00:00:00 migration/0 15 ? 00:00:00 idle_inject/0 17 ? 00:00:00 cpuhp/0 18 ? 00:00:00 cpuhp/1 19 ? 00:00:00 idle_inject/1 20 ? 00:00:00 migration/1 21 ? 00:00:01 ksoftirqd/1 24 ? 00:00:00 cpuhp/2 25 ? 00:00:00 idle_inject/2 26 ? 00:00:00 migration/2 27 ? 00:00:01 ksoftirqd/2 30 ? 00:00:00 cpuhp/3 31 ? 00:00:00 idle_inject/3 32 ? 00:00:00 migration/3 33 ? 00:00:01 ksoftirqd/3 36 ? 00:00:00 kdevtmpfs 37 ? 00:00:00 netns 38 ? 00:00:00 inet_frag_wq 39 ? 00:00:00 kauditd 40 ? 00:00:00 khungtaskd 41 ? 00:00:00 oom_reaper 42 ? 00:00:00 writeback 43 ? 00:00:00 kcompactd0 44 ? 00:00:00 ksmd 45 ? 00:00:00 khugepaged 94 ? 00:00:00 kintegrityd 95 ? 00:00:00 kblockd 96 ? 00:00:00 blkcg_punt_bio 97 ? 00:00:00 tpm_dev_wq 98 ? 00:00:00 ata_sff 99 ? 00:00:00 md 100 ? 00:00:00 edac-poller 101 ? 00:00:00 devfreq_wq 103 ? 00:00:00 watchdogd 105 ? 00:00:01 kworker/3:1H-kblockd 106 ? 00:00:00 kswapd0 107 ? 00:00:00 ecryptfs-kthrea 109 ? 00:00:00 kthrotld 110 ? 00:00:00 irq/69-aerdrv 111 ? 00:00:00 nvme-wq 112 ? 00:00:00 nvme-reset-wq 113 ? 00:00:00 nvme-delete-wq 115 ? 00:00:00 DWC Notificatio 118 ? 00:00:00 vchiq-slot/0 119 ? 00:00:00 vchiq-recy/0 120 ? 00:00:00 vchiq-sync/0 121 ? 00:00:01 kworker/1:1H-kblockd 122 ? 00:00:00 ipv6_addrconf 132 ? 00:00:00 kstrp 135 ? 00:00:00 zswap-shrink 136 ? 00:00:00 kworker/u9:0-hci0 142 ? 00:00:00 spi0 143 ? 00:00:00 sdhci 144 ? 00:00:00 irq/55-mmc0 145 ? 00:00:00 charger_manager 167 ? 00:00:00 mmc_complete 170 ? 00:00:01 kworker/0:1H-mmc_complete 171 ? 00:00:01 kworker/2:1H-kblockd 255 ? 00:00:01 jbd2/mmcblk0p2- 256 ? 00:00:00 ext4-rsv-conver 312 ? 00:00:02 systemd-journal 353 ? 00:00:00 loop0 354 ? 00:00:00 loop1 355 ? 00:00:00 loop2 356 ? 00:00:00 loop3 358 ? 00:00:01 systemd-udevd 359 ? 00:00:00 loop4 402 ? 00:00:00 vchiq-keep/0 403 ? 00:00:00 SMIO 411 ? 00:00:13 v3d_bin 412 ? 00:00:16 v3d_render 413 ? 00:00:00 v3d_tfu 414 ? 00:00:00 v3d_csd 415 ? 00:00:00 v3d_cache_clean 423 ? 00:00:00 mmal-vchiq 426 ? 00:00:00 mmal-vchiq 427 ? 00:00:00 mmal-vchiq 428 ? 00:00:00 mmal-vchiq 440 ? 00:00:00 cfg80211 447 ? 00:00:00 brcmf_wq/mmc1:0 448 ? 00:00:01 brcmf_wdog/mmc1 451 ? 00:00:00 cec-vc4 452 ? 00:00:00 irq/43-vc4 hdmi 453 ? 00:00:00 irq/42-vc4 hdmi 455 ? 00:00:00 cec-vc4 456 ? 00:00:00 irq/49-vc4 hdmi 457 ? 00:00:00 irq/48-vc4 hdmi 458 ? 00:00:00 card1-crtc0 459 ? 00:00:00 card1-crtc1 460 ? 00:00:00 card1-crtc2 461 ? 00:00:00 card1-crtc3 462 ? 00:00:00 card1-crtc4 463 ? 00:00:00 card1-crtc5 620 ? 00:00:03 systemd-resolve 622 ? 00:00:00 systemd-timesyn 652 ? 00:00:00 avahi-daemon 653 ? 00:00:08 dbus-daemon 655 ? 00:00:21 NetworkManager 666 ? 00:00:06 irqbalance 667 ? 00:00:00 networkd-dispat 668 ? 00:00:02 polkitd 669 ? 00:00:00 power-profiles- 672 ? 00:00:00 rsyslogd 683 ? 00:00:01 accounts-daemon 685 ? 00:00:00 cron 686 ? 00:00:00 switcheroo-cont 687 ? 00:00:01 systemd-logind 691 ? 00:00:03 udisksd 692 ? 00:00:01 wpa_supplicant 699 ? 00:00:00 avahi-daemon 772 ? 00:00:00 cupsd 776 ? 00:00:00 unattended-upgr 777 ? 00:00:00 ModemManager 797 ? 00:00:00 gdm3 811 ? 00:00:00 gdm-session-wor 829 ? 00:00:00 cups-browsed 877 ? 00:00:03 systemd 878 ? 00:00:00 (sd-pam) 887 ? 00:00:00 kworker/u9:1-hci0 888 ? 00:00:00 hciattach 896 ? 00:00:00 bluetoothd 910 ? 00:00:00 pipewire 911 ? 00:00:00 pipewire-media- 912 ? 00:13:24 pulseaudio 915 ? 00:00:00 tracker-miner-f 921 ? 00:00:00 gnome-keyring-d 926 ? 00:00:00 rtkit-daemon 928 tty2 00:00:00 gdm-wayland-ses 932 ? 00:00:03 dbus-daemon 938 tty2 00:00:00 gnome-session-b 948 ? 00:00:00 gvfsd 981 ? 00:00:00 gvfsd-fuse 990 ? 00:00:00 gvfs-udisks2-vo 1003 ? 00:00:00 krfcommd 1006 ? 00:00:00 gvfs-goa-volume 1010 ? 00:00:00 goa-daemon 1018 ? 00:00:00 gnome-session-c 1027 ? 00:00:00 gnome-session-b 1037 ? 00:00:00 goa-identity-se 1046 ? 00:00:00 gvfs-gphoto2-vo 1058 ? 00:00:00 at-spi-bus-laun 1063 ? 00:00:00 gvfs-mtp-volume 1070 ? 00:16:58 gnome-shell 1071 ? 00:00:00 dbus-daemon 1077 ? 00:00:01 gvfs-afc-volume 1082 ? 00:00:00 upowerd 1123 ? 00:00:00 whoopsie 1124 ? 00:00:00 kerneloops 1126 ? 00:00:00 kerneloops 1148 ? 00:00:03 Xwayland 1168 ? 00:00:00 xdg-permission- 1173 ? 00:00:00 gnome-shell-cal 1179 ? 00:00:00 evolution-sourc 1184 ? 00:00:02 geoclue 1187 ? 00:00:00 evolution-calen 1193 ? 00:00:00 packagekitd 1204 ? 00:00:00 dconf-service 1206 ? 00:00:00 evolution-addre 1211 ? 00:00:00 gvfsd-metadata 1229 ? 00:00:00 gjs 1230 ? 00:00:00 at-spi2-registr 1242 ? 00:00:00 gvfsd-trash 1253 ? 00:00:00 gsd-a11y-settin 1255 ? 00:00:00 gsd-color 1256 ? 00:00:00 gsd-datetime 1257 ? 00:00:01 gsd-housekeepin 1258 ? 00:00:00 gsd-keyboard 1263 ? 00:00:00 gsd-media-keys 1269 ? 00:00:00 gsd-power 1271 ? 00:00:00 gsd-print-notif 1272 ? 00:00:00 gsd-rfkill 1274 ? 00:00:00 gsd-screensaver 1278 ? 00:00:01 gsd-sharing 1281 ? 00:00:00 gsd-smartcard 1289 ? 00:00:00 gsd-sound 1291 ? 00:00:00 gsd-wacom 1316 ? 00:00:00 gsd-disk-utilit 1322 ? 00:00:01 evolution-alarm 1360 ? 00:00:00 gsd-printer 1397 ? 00:00:00 colord 1439 ? 00:00:50 ibus-daemon 1440 ? 00:00:01 gsd-xsettings 1445 ? 00:00:00 ibus-memconf 1446 ? 00:00:16 ibus-extension- 1449 ? 00:00:00 ibus-x11 1452 ? 00:00:00 ibus-portal 1471 ? 00:00:12 ibus-engine-sim 1475 ? 00:00:02 gjs 1543 ? 00:01:38 gnome-terminal- 1548 pts/0 00:00:00 bash 1558 ? 00:00:01 update-notifier 1680 ? 00:00:00 loop5 1708 ? 00:00:00 gvfsd-network 1714 ? 00:00:00 gvfsd-smb-brows 1721 ? 00:00:00 gvfsd-dnssd 1826 ? 00:00:00 loop6 1842 ? 00:00:55 snapd 2049 ? 00:00:00 loop7 2289 ? 00:00:00 scsi_eh_0 2290 ? 00:00:00 scsi_tmf_0 2291 ? 00:00:05 usb-storage 2293 ? 00:00:00 uas 2575 ? 00:00:00 loop8 2595 ? 00:00:00 jbd2/sdc2-8 2596 ? 00:00:00 ext4-rsv-conver 2650 ? 00:05:08 gedit 3259 ? 00:00:30 nautilus 9682 ? 00:00:02 kworker/3:0-events 10157 ? 00:01:28 gnome-control-c 10219 ? 00:00:02 kworker/1:0-events 10248 ? 00:00:02 kworker/u8:4-ext4-rsv-conversion 10457 ? 00:00:02 kworker/2:2-events 10473 ? 00:00:46 firefox 10533 ? 00:00:09 Web Content 10574 ? 00:00:03 WebExtensions 10630 ? 00:00:01 Web Content 10663 ? 00:00:01 kworker/u8:1-events_unbound 10678 pts/1 00:00:00 bash 10696 ? 00:00:01 kworker/0:3-events 11237 ? 00:00:00 kworker/3:2-mm_percpu_wq 11242 ? 00:00:00 kworker/2:1-cgroup_destroy 11251 ? 00:00:00 kworker/u8:2-events_power_efficient 11262 pts/2 00:00:00 bash 11285 ? 00:00:00 kworker/3:1-events_freezable 11287 ? 00:00:00 kworker/1:2H 11288 ? 00:00:00 kworker/0:1-events 11292 ? 00:00:00 kworker/1:1-events 11293 ? 00:00:00 kworker/2:0-mm_percpu_wq 11294 ? 00:00:00 kworker/0:0H 11298 ? 00:00:00 kworker/3:2H 11321 ? 00:00:00 kworker/u8:0-events_unbound 11329 pts/0 00:00:00 sudo 11330 ? 00:00:03 thttpd 11331 ? 00:00:00 kworker/2:0H-kblockd 11345 ? 00:00:00 kworker/1:0H 11346 ? 00:00:00 kworker/0:0-events 11352 ? 00:00:00 kworker/2:3 11353 ? 00:00:00 kworker/2:4-events 11354 ? 00:00:00 kworker/1:2-events 11362 ? 00:00:00 kworker/3:3-events 11387 ? 00:00:00 kworker/0:2-events 11424 ? 00:00:00 kworker/0:2H 11720 ? 00:00:00 kworker/3:0H 11761 ? 00:00:00 kworker/2:2H 11775 pts/3 00:00:00 bash 11782 pts/3 00:00:00 ps frank@frank-desktop:~$ Typing “localhost” on the browser, we get: Index of / mode links bytes last-changed name dr-x 4 4096 Jun 14 23:06 ./ dr-x 5 4096 Jun 14 23:36 ../ dr-x 2 4096 Jun 14 23:00 ac0xl/ dr-x 2 4096 Jun 14 23:06 documents/ In a new terminal, type: "cd /usr/local/www/logs" frank@frank-desktop:~$ frank@frank-desktop:~$ cd /usr/local/www/logs frank@frank-desktop:/usr/local/www/logs$ ls -al total 12 drwxr-xr-x 2 root www 4096 Jun 14 18:14 . drwxr-xr-x 5 root www 4096 Jun 14 17:36 .. -rw-r--r-- 1 nobody nogroup 227 Jun 14 18:26 thttpd_log frank@frank-desktop:/usr/local/www/logs$ cat *log 127.0.0.1 - - [15/Jun/2021:00:17:39 +0000] "GET / HTTP/1.1" 200 25000 "" "Mozilla/5.0 (X11; Ubuntu; Linux aarch64; rv:89.0) Gecko/20100101 Firefox/89.0" 127.0.0.1 - - [15/Jun/2021:00:26:54 +0000] "UNKNOWN UNKNOWN" 400 0 "" "" frank@frank-desktop:/usr/local/www/logs$ The program thttpd is working OK. so we can kill its pid (11330).cd - frank@frank-desktop:/usr/local/www/logs$ frank@frank-desktop:/usr/local/www/logs$ sudo kill 11330 [sudo] password for frank: frank@frank-desktop:/usr/local/www/logs$ This freed up the terminal that was running thttpd. On the busy terminal, Control C an Control X won't stop the program. The only way to stop it is by going to a different terminal and find "thttpd" in "ps -e" then "sudo kill (program number), in this case it was 11330. Now we need to add the files to "users" that are in "/usr/local/sbin/thttpd-extras". cd /usr/local/sbin/thttpd-extras/ frank@frank-desktop:~$ cd /usr/local/sbin/thttpd-extras/ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ ls -al total 60 drwxr-xr-x 2 root root 4096 Jun 14 17:14 . drwxr-xr-x 4 root root 4096 Jun 14 18:04 .. -rw-r--r-- 1 root root 533 Jun 14 17:14 anvil_thttpd.gif -rw-r--r-- 1 root root 533 Jun 14 17:14 favicon.ico -rwxr-xr-x 1 root root 485 Jun 14 17:14 rc.local -rw-r--r-- 1 root root 247 Jun 14 17:14 readme.txt -rw-r--r-- 1 root root 73 Jun 14 17:14 robots-site.txt -rw-r--r-- 1 root root 27 Jun 14 17:14 robots.txt -rw-r--r-- 1 root root 186 Jun 14 17:14 sitemap.xml -rw-r--r-- 1 root root 186 Jun 14 17:14 sitemap.xml.txt -rwxr-xr-x 1 root root 456 Jun 14 17:14 thttpd_config -rwxr-xr-x 1 root root 456 Jun 14 17:14 thttpd_config~ -rwxr-xr-x 1 root root 1745 Jun 14 17:14 thttpd-rotate -rwxr-xr-x 1 root root 136 Jun 14 17:14 thttpd.sh -rwxr-xr-x 1 root root 120 Jun 14 17:14 thttpd_wrapper frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ (Since these files are owned by root you will need to use sudo to copy them.) frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ sudo cp -iav favicon.ico /usr/local/www/users/ [sudo] password for frank: 'favicon.ico' -> '/usr/local/www/users/favicon.ico' frank@frank-desktop:/usr/local/sbin/thttpd-extras$ sudo cp -iav readme.txt /usr/local/www/users/ 'readme.txt' -> '/usr/local/www/users/readme.txt' frank@frank-desktop:/usr/local/sbin/thttpd-extras$ sudo cp -iav robots.txt /usr/local/www/users/ 'robots.txt' -> '/usr/local/www/users/robots.txt' *********** frank@frank-desktop:/usr/local/sbin/thttpd-extras$ cat robots-site.txt User-agent: * Disallow: Sitemap: http://xxx.xxx.xxx.xxx/sitemap.xml/ ****** frank@frank-desktop:/usr/local/sbin/thttpd-extras$ cat sitemap.xml http://xxx.xxx.xxx.xxx/ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ ******* You would use "robots-site.txt" replacing the XXX.xxx.xxx.xxx with your external static IPv4 address and then naming it "robots.txt". Likewise, with the "sitemap.xml" file and keep the same name for it. Adding both of these files to “/usr/local/www/users/”, if you have an external static IP address. ****************** frank@frank-desktop:/usr/local/sbin/thttpd-extras$ frank@frank-desktop:/usr/local/sbin/thttpd-extras$ cd /etc frank@frank-desktop:/etc$ # ****If you don't use sudo here it will start looping every 10 seconds. Then you would have to find the pid number for thttpd_wrapper and sudo kill "pid-number" because it is trying to write to root files!!!, or just turn off the computer.**** frank@frank-desktop:/etc$ sudo ./rc.local # (Starting thttpd from rc.local, REMEMBER the sudo!!!!!!) My IP address is 192.168.19.13 Starting thttpd. thttpdfrank@frank-desktop:/etc$ (Notice the thttpd in front of frank@frank-desktop:/etc$ on the terminal screen, it is still running.) Typing “192.168.19.13” on the browser, we get: Index of / mode links bytes last-changed name dr-x 4 4096 Jun 15 01:08 ./ dr-x 5 4096 Jun 14 23:36 ../ dr-x 2 4096 Jun 14 23:00 ac0xl/ dr-x 2 4096 Jun 14 23:06 documents/ -r-- 1 533 Jun 14 23:14 favicon.ico -r-- 1 247 Jun 14 23:14 readme.txt -r-- 1 27 Jun 14 23:14 robots.txt thttpdfrank@frank-desktop:/etc$ frank@frank-desktop:/etc$ frank@frank-desktop:/etc$ cat /usr/local/www/logs/*log 127.0.0.1 - - [15/Jun/2021:00:17:39 +0000] "GET / HTTP/1.1" 200 25000 "" "Mozilla/5.0 (X11; Ubuntu; Linux aarch64; rv:89.0) Gecko/20100101 Firefox/89.0" 127.0.0.1 - - [15/Jun/2021:00:26:54 +0000] "UNKNOWN UNKNOWN" 400 0 "" "" 192.168.19.13 - - [15/Jun/2021:01:12:52 +0000] "GET / HTTP/1.1" 200 25000 "" "Mozilla/5.0 (X11; Ubuntu; Linux aarch64; rv:89.0) Gecko/20100101 Firefox/89.0" 192.168.19.13 - - [15/Jun/2021:01:13:05 +0000] "GET /ac0xl/ HTTP/1.1" 200 25000 "http://192.168.19.13/" "Mozilla/5.0 (X11; Ubuntu; Linux aarch64; rv:89.0) Gecko/20100101 Firefox/89.0" 192.168.19.13 - - [15/Jun/2021:01:13:09 +0000] "GET /documents/ HTTP/1.1" 200 25000 "http://192.168.19.13/" "Mozilla/5.0 (X11; Ubuntu; Linux aarch64; rv:89.0) Gecko/20100101 Firefox/89.0" 192.168.19.13 - - [15/Jun/2021:01:13:13 +0000] "GET /favicon.ico HTTP/1.1" 200 533 "http://192.168.19.13/" "Mozilla/5.0 (X11; Ubuntu; Linux aarch64; rv:89.0) Gecko/20100101 Firefox/89.0" 192.168.19.13 - - [15/Jun/2021:01:13:26 +0000] "GET /readme.txt HTTP/1.1" 200 247 "http://192.168.19.13/" "Mozilla/5.0 (X11; Ubuntu; Linux aarch64; rv:89.0) Gecko/20100101 Firefox/89.0" 192.168.19.13 - - [15/Jun/2021:01:13:26 +0000] "GET /favicon.ico HTTP/1.1" 200 533 "http://192.168.19.13/readme.txt" "Mozilla/5.0 (X11; Ubuntu; Linux aarch64; rv:89.0) Gecko/20100101 Firefox/89.0" 192.168.19.13 - - [15/Jun/2021:01:13:48 +0000] "UNKNOWN UNKNOWN" 400 0 "" "" 192.168.19.13 - - [15/Jun/2021:01:13:54 +0000] "UNKNOWN UNKNOWN" 400 0 "" "" 192.168.19.13 - - [15/Jun/2021:01:13:57 +0000] "GET /robots.txt HTTP/1.1" 200 27 "http://192.168.19.13/" "Mozilla/5.0 (X11; Ubuntu; Linux aarch64; rv:89.0) Gecko/20100101 Firefox/89.0" frank@frank-desktop:/etc$ By clicking on each entry everything works! and now shows up in the log file. frank@frank-desktop:/etc$ frank@frank-desktop:/etc$ ps -e frank@frank-desktop:/etc$ ps -e PID TTY TIME CMD 1 ? 00:00:15 systemd 2 ? 00:00:00 kthreadd 3 ? 00:00:00 rcu_gp 4 ? 00:00:00 rcu_par_gp 8 ? 00:00:00 mm_percpu_wq 9 ? 00:00:00 rcu_tasks_kthre 10 ? 00:00:00 rcu_tasks_rude_ 11 ? 00:00:00 rcu_tasks_trace 12 ? 00:00:02 ksoftirqd/0 13 ? 00:00:20 rcu_preempt 14 ? 00:00:00 migration/0 15 ? 00:00:00 idle_inject/0 17 ? 00:00:00 cpuhp/0 18 ? 00:00:00 cpuhp/1 19 ? 00:00:00 idle_inject/1 20 ? 00:00:00 migration/1 21 ? 00:00:01 ksoftirqd/1 24 ? 00:00:00 cpuhp/2 25 ? 00:00:00 idle_inject/2 26 ? 00:00:00 migration/2 27 ? 00:00:01 ksoftirqd/2 30 ? 00:00:00 cpuhp/3 31 ? 00:00:00 idle_inject/3 32 ? 00:00:00 migration/3 33 ? 00:00:01 ksoftirqd/3 36 ? 00:00:00 kdevtmpfs 37 ? 00:00:00 netns 38 ? 00:00:00 inet_frag_wq 39 ? 00:00:00 kauditd 40 ? 00:00:00 khungtaskd 41 ? 00:00:00 oom_reaper 42 ? 00:00:00 writeback 43 ? 00:00:01 kcompactd0 44 ? 00:00:00 ksmd 45 ? 00:00:00 khugepaged 94 ? 00:00:00 kintegrityd 95 ? 00:00:00 kblockd 96 ? 00:00:00 blkcg_punt_bio 97 ? 00:00:00 tpm_dev_wq 98 ? 00:00:00 ata_sff 99 ? 00:00:00 md 100 ? 00:00:00 edac-poller 101 ? 00:00:00 devfreq_wq 103 ? 00:00:00 watchdogd 105 ? 00:00:01 kworker/3:1H-kblockd 106 ? 00:00:00 kswapd0 107 ? 00:00:00 ecryptfs-kthrea 109 ? 00:00:00 kthrotld 110 ? 00:00:00 irq/69-aerdrv 111 ? 00:00:00 nvme-wq 112 ? 00:00:00 nvme-reset-wq 113 ? 00:00:00 nvme-delete-wq 115 ? 00:00:00 DWC Notificatio 118 ? 00:00:00 vchiq-slot/0 119 ? 00:00:00 vchiq-recy/0 120 ? 00:00:00 vchiq-sync/0 121 ? 00:00:01 kworker/1:1H-kblockd 122 ? 00:00:00 ipv6_addrconf 132 ? 00:00:00 kstrp 135 ? 00:00:00 zswap-shrink 136 ? 00:00:00 kworker/u9:0-hci0 142 ? 00:00:00 spi0 143 ? 00:00:00 sdhci 144 ? 00:00:00 irq/55-mmc0 145 ? 00:00:00 charger_manager 167 ? 00:00:00 mmc_complete 170 ? 00:00:02 kworker/0:1H-kblockd 255 ? 00:00:01 jbd2/mmcblk0p2- 256 ? 00:00:00 ext4-rsv-conver 312 ? 00:00:02 systemd-journal 353 ? 00:00:00 loop0 354 ? 00:00:00 loop1 355 ? 00:00:00 loop2 356 ? 00:00:00 loop3 358 ? 00:00:01 systemd-udevd 359 ? 00:00:00 loop4 402 ? 00:00:00 vchiq-keep/0 403 ? 00:00:00 SMIO 411 ? 00:00:25 v3d_bin 412 ? 00:00:29 v3d_render 413 ? 00:00:00 v3d_tfu 414 ? 00:00:00 v3d_csd 415 ? 00:00:00 v3d_cache_clean 423 ? 00:00:00 mmal-vchiq 426 ? 00:00:00 mmal-vchiq 427 ? 00:00:00 mmal-vchiq 428 ? 00:00:00 mmal-vchiq 440 ? 00:00:00 cfg80211 447 ? 00:00:00 brcmf_wq/mmc1:0 448 ? 00:00:01 brcmf_wdog/mmc1 451 ? 00:00:00 cec-vc4 452 ? 00:00:00 irq/43-vc4 hdmi 453 ? 00:00:00 irq/42-vc4 hdmi 455 ? 00:00:00 cec-vc4 456 ? 00:00:00 irq/49-vc4 hdmi 457 ? 00:00:00 irq/48-vc4 hdmi 458 ? 00:00:00 card1-crtc0 459 ? 00:00:00 card1-crtc1 460 ? 00:00:00 card1-crtc2 461 ? 00:00:00 card1-crtc3 462 ? 00:00:00 card1-crtc4 463 ? 00:00:00 card1-crtc5 620 ? 00:00:03 systemd-resolve 622 ? 00:00:00 systemd-timesyn 652 ? 00:00:00 avahi-daemon 653 ? 00:00:12 dbus-daemon 655 ? 00:00:29 NetworkManager 666 ? 00:00:07 irqbalance 667 ? 00:00:00 networkd-dispat 668 ? 00:00:04 polkitd 669 ? 00:00:00 power-profiles- 672 ? 00:00:00 rsyslogd 683 ? 00:00:01 accounts-daemon 685 ? 00:00:00 cron 686 ? 00:00:00 switcheroo-cont 687 ? 00:00:01 systemd-logind 691 ? 00:00:03 udisksd 692 ? 00:00:02 wpa_supplicant 699 ? 00:00:00 avahi-daemon 772 ? 00:00:00 cupsd 776 ? 00:00:00 unattended-upgr 777 ? 00:00:00 ModemManager 797 ? 00:00:00 gdm3 811 ? 00:00:00 gdm-session-wor 829 ? 00:00:00 cups-browsed 877 ? 00:00:03 systemd 878 ? 00:00:00 (sd-pam) 887 ? 00:00:00 kworker/u9:1-hci0 888 ? 00:00:00 hciattach 896 ? 00:00:00 bluetoothd 910 ? 00:00:00 pipewire 911 ? 00:00:00 pipewire-media- 912 ? 00:13:24 pulseaudio 915 ? 00:00:00 tracker-miner-f 921 ? 00:00:00 gnome-keyring-d 926 ? 00:00:00 rtkit-daemon 928 tty2 00:00:00 gdm-wayland-ses 932 ? 00:00:03 dbus-daemon 938 tty2 00:00:00 gnome-session-b 948 ? 00:00:00 gvfsd 981 ? 00:00:00 gvfsd-fuse 990 ? 00:00:00 gvfs-udisks2-vo 1003 ? 00:00:00 krfcommd 1006 ? 00:00:00 gvfs-goa-volume 1010 ? 00:00:00 goa-daemon 1018 ? 00:00:00 gnome-session-c 1027 ? 00:00:00 gnome-session-b 1037 ? 00:00:00 goa-identity-se 1046 ? 00:00:00 gvfs-gphoto2-vo 1058 ? 00:00:00 at-spi-bus-laun 1063 ? 00:00:00 gvfs-mtp-volume 1070 ? 00:24:45 gnome-shell 1071 ? 00:00:00 dbus-daemon 1077 ? 00:00:01 gvfs-afc-volume 1082 ? 00:00:00 upowerd 1123 ? 00:00:00 whoopsie 1124 ? 00:00:00 kerneloops 1126 ? 00:00:00 kerneloops 1148 ? 00:00:04 Xwayland 1168 ? 00:00:00 xdg-permission- 1173 ? 00:00:00 gnome-shell-cal 1179 ? 00:00:00 evolution-sourc 1184 ? 00:00:03 geoclue 1187 ? 00:00:00 evolution-calen 1193 ? 00:00:00 packagekitd 1204 ? 00:00:00 dconf-service 1206 ? 00:00:00 evolution-addre 1211 ? 00:00:00 gvfsd-metadata 1229 ? 00:00:00 gjs 1230 ? 00:00:00 at-spi2-registr 1242 ? 00:00:00 gvfsd-trash 1253 ? 00:00:00 gsd-a11y-settin 1255 ? 00:00:01 gsd-color 1256 ? 00:00:00 gsd-datetime 1257 ? 00:00:01 gsd-housekeepin 1258 ? 00:00:00 gsd-keyboard 1263 ? 00:00:00 gsd-media-keys 1269 ? 00:00:00 gsd-power 1271 ? 00:00:00 gsd-print-notif 1272 ? 00:00:00 gsd-rfkill 1274 ? 00:00:00 gsd-screensaver 1278 ? 00:00:02 gsd-sharing 1281 ? 00:00:00 gsd-smartcard 1289 ? 00:00:00 gsd-sound 1291 ? 00:00:00 gsd-wacom 1316 ? 00:00:00 gsd-disk-utilit 1322 ? 00:00:01 evolution-alarm 1360 ? 00:00:00 gsd-printer 1397 ? 00:00:00 colord 1439 ? 00:01:10 ibus-daemon 1440 ? 00:00:01 gsd-xsettings 1445 ? 00:00:00 ibus-memconf 1446 ? 00:00:21 ibus-extension- 1449 ? 00:00:00 ibus-x11 1452 ? 00:00:00 ibus-portal 1471 ? 00:00:17 ibus-engine-sim 1475 ? 00:00:03 gjs 1543 ? 00:02:10 gnome-terminal- 1548 pts/0 00:00:00 bash 1558 ? 00:00:01 update-notifier 1680 ? 00:00:00 loop5 1708 ? 00:00:00 gvfsd-network 1714 ? 00:00:00 gvfsd-smb-brows 1721 ? 00:00:00 gvfsd-dnssd 1826 ? 00:00:00 loop6 1842 ? 00:00:55 snapd 2049 ? 00:00:00 loop7 2289 ? 00:00:00 scsi_eh_0 2290 ? 00:00:00 scsi_tmf_0 2291 ? 00:00:07 usb-storage 2293 ? 00:00:00 uas 2575 ? 00:00:00 loop8 2595 ? 00:00:00 jbd2/sdc2-8 2596 ? 00:00:00 ext4-rsv-conver 2650 ? 00:07:15 gedit 3259 ? 00:00:33 nautilus 10157 ? 00:03:51 gnome-control-c 10678 pts/1 00:00:00 bash 11262 pts/2 00:00:00 bash 11321 ? 00:00:05 kworker/u8:0-events_power_efficient 11775 pts/3 00:00:00 bash 11919 pts/4 00:00:00 bash 11958 ? 00:00:01 kworker/3:2-events 12019 ? 00:00:00 kworker/2:0H-kblockd 12067 ? 00:00:02 kworker/u8:3-events_unbound 12086 ? 00:00:01 kworker/u8:2+events_unbound 12089 ? 00:00:01 kworker/3:1-events 12093 ? 00:00:02 kworker/2:1-events 12132 pts/0 00:00:00 thttpd_wrapper 12133 ? 00:00:08 thttpd 12134 ? 00:00:00 kworker/0:1-events 12140 ? 00:00:00 kworker/3:2H 12144 ? 00:00:00 kworker/1:0H 12153 ? 00:00:00 kworker/0:0H 12174 ? 00:00:01 kworker/1:3-events 12178 ? 00:00:20 firefox 12238 ? 00:00:04 Web Content 12283 ? 00:00:02 WebExtensions 12337 ? 00:00:01 Web Content 12365 ? 00:00:00 kworker/2:2H 12370 ? 00:00:00 kworker/2:0-events 12385 ? 00:00:00 kworker/0:2-events 12389 ? 00:00:00 kworker/1:0-mm_percpu_wq 12392 ? 00:00:00 kworker/3:3-mm_percpu_wq 12395 ? 00:00:00 kworker/2:2-events 12397 ? 00:00:00 kworker/u8:1 12401 ? 00:00:00 kworker/0:0-events 12405 ? 00:00:00 kworker/0:3-events 12406 ? 00:00:00 kworker/1:1-events 12408 ? 00:00:00 kworker/u8:4 12409 ? 00:00:00 kworker/1:2H 12412 pts/0 00:00:00 ps frank@frank-desktop:/etc$ PID 12132 is thttpd_wrapper and PID 12133 is thttpd. frank@frank-desktop:/etc$ frank@frank-desktop:/etc$ less services # This will show a listing of service ports. ... (This file has a list of "Ports" that are in use. The default "HTTP port is 80.") thttpd's default port is 80, port numbers are 16-bit so can range from 1 - 65536. Only one service can use a port number at a time, thus we see that my Raspberry Pi web server will give the same information on all of the IPv4 addresses that are attached to it, i.e., eth0, and wlan0 with its different IP addresses both connected to the same http port 80. In a classroom situation, more than 200 students can be connected to the same "C" class network (192.168.xxx.0/24) and can each connect to each other's web servers, where xxx is the same for all, and the 0 position can very from 2 - 254, with 0 representing the network, 255 is reserved for the broadcast address, and 1 reserved for the router address. With the router set up as a “DHCP Server” all of the computers would receive dynamic IP addresses and all of their http websites would be available in the addresses they were assigned. The http port number (80) is assigned by the computers and the IP addresses are assigned from the router. The router separates the “Local Area Network” (LAN) from the “Wide Area Network” (WAN). Just as the HTTP default address is port 80 and is static, the router has to have the internal IP address for our website “static” so it can pass information back and forth from our internal web server to the external Internet. In the file “2019-10-01-website.txt” I discuss the process of setting the internal web server to a static internal IP address. In the router, under the “Advanced” tab, select “Virtual Server”, and it should display a message similar to: “This page allows you to configure a virtual server, so others can access the server through the Gateway.” This will probably very with different routers so one might have to search a bit to find the similar place. The “usual Service Name” should have a selection of something like “web” or “http” and choose this. It should then show the “Protocol” as “TCP”, “WAN Port” as “80”, and “LAN Open Port” as “80”. In the “LAN IP Address” type in the static internal IP address of your web server, and press, “Apply Changes”. This should fill in a table in “Current Virtual Server Forwarding Table” with “ServerName - WEB”, “Protocol - tcp”, “Local IP Address - 192.168.x.2” i.e., your internal IP address, “Local Port - 80-80”, “WAN Port - 80-80”, “State - Enable”, and possibly “Action either Delete or Disable”. With this enabled, your website should be available to the WAN. Since your ISP is providing your external IP address, it doesn’t matter if it is dynamic or static. Until you get an idea of the activity that is taking place on the web, it would probably be good just to have a dynamic address if that is what you have. If you are in an area of extreme censorship, it will make the censorship game more of a “Cat and Mouse” game since your site could be bouncing around all sorts of different IP addresses. “Free Speech for the WORLD!” Another reason we use "/home" user directories in the "www" group is to be able to keep all of our original web files there and then just send a copy to the "public_html" directory where it is instantly live. This also reduces the size of our web site by eliminating the bloat of having original files mixed in with our files needed for the web site. It will also reduce the time it will take for the Web Search "spiders" to see what content is available on our sites. When we use "HTML" code for our web pages, the root of the page will be in "index.html" and then the items listed in this file can be in the same directory or in sub directories. If you have a lot of "images" on your web page, you would probably want to put all of them in a sub-directory called, "images" just to keep similar things together and easier to find. To test your "index.html" file, you just open it with a web browser and see if everything is functioning. Then when everything is OK, just move your changes and additions to "public_html" and then open your web browser to "http://xxx.xxx.xxx.xxx/" and see if everything is working. Most web browsers keep a copy of your pages in cache so if the changes don't appear you will have to refresh your web page (usually the little circle with an arrow on it). If the changes still don't appear, possibly you forgot to move the changes to "public_html". Just a reminder, all of the directories in "public_html" need to be "0755" to work and files need to be "0644" to work. If you get to the point of using "cgi" programs they will also need to be "0755" so they can execute, and also need to have the right ending on those files, the documentation for "thttpd" talks about all of this. Links: These links are the easiest and best I have found for sharing the “Good News” I found around my seventh birthday, the Fall of 1955. Frank Anderson, ac0xl. http://4laws.com/laws/languages.html, 4 Spiritual Laws. https://www.cru.org/us/en/train-and-grow/spiritual-growth/the-spirit-filled-life.html, The Spirit Filled Life. https://www.cru.org, Exploring Your Life’s Purpose - Let’s journey together. https://godtoolsapp.com, GodTools - Helping You Share Your Faith. #