Compare commits

..

No commits in common. "master" and "master" have entirely different histories.

113 changed files with 768 additions and 4750 deletions

View File

@ -1,12 +0,0 @@
---
kind: pipeline
name: shellcheck
steps:
- name: shellcheck
image: koalaman/shellcheck-alpine:stable
commands:
- shellcheck bin/*
- shellcheck efingerd/*
- shellcheck completion/*
- shellcheck update-motd/*

View File

@ -1,3 +0,0 @@
language: shell
script:
- bash -c 'shopt -s globstar; shellcheck {bin,efingerd,completion,update-motd}/*'

View File

@ -1,84 +0,0 @@
help:
@echo "targets:"
@awk -F '#' '/^\w+:.*?#/ { print $0 }' $(MAKEFILE_LIST) \
| sed -n 's/^\(.*\): \(.*\)#\(.*\)/ \1|-\3/p' \
| column -t -s '|'
install: apt bin templates man completion files efingerd menu postfix updatemotd source # install everything
.PHONY: help apt bin templates man completion files efingerd menu postfix updatemotd source
apt: # install all apt packages
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
if [ ! -f "/etc/apt/sources.list.d/yarn.list" ]; then \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list; \
fi
xargs -a pkglist sudo apt install -y
source: # clone all manual source packages to /var/packages
@while IFS= read -r line; do \
name=$$(printf "%s" "$$line" | awk -F "\t" '{print $$1}'); \
repo=$$(printf "%s" "$$line" | awk -F "\t" '{print $$2}'); \
dir="/var/packages/$${name}"; \
if [ ! -d "$$dir" ]; then \
mkdir -p "$$dir"; \
git clone "$$repo" "$$dir"; \
else \
printf "%s already cloned\\n" "$${name}"; \
fi; \
done < "pkglist-source"
bin: # link bin scripts to /usr/local/bin
stow -t "/usr/local/bin" bin
templates: # link template files
mkdir -p "/etc/templates"
stow -t "/etc/templates" templates
man: # link system man pages
mkdir -p "/usr/share/man/man1"
stow -t "/usr/share/man/man1" man
completion: # add bash completions
mkdir -p "/etc/bash_completion.d"
stow -t "/etc/bash_completion.d" completion
files: # link miscellaneous files
mkdir -p "/usr/share/games/fortunes"
cd files && stow -t "/usr/share/games/fortunes" fortunes
efingerd: # install finger scripts
mkdir -p "/etc/efingerd"
stow -t "/etc/efingerd" efingerd
updatemotd: # link motd files
mkdir -p "/etc/update-motd.d"
stow -t "/etc/update-motd.d" update-motd
sudo chown -R root /etc/update-motd.d
menu: # install the system interactive menu
stow -t "/etc" menu
postfix: # set up postfix for tilde-only email
if ! grep -q 'transport_maps' "/etc/postfix/main.cf"; then \
printf "transport_maps = hash:/etc/postfix/transport\n" >> "/etc/postfix/main.cf"; \
printf "smtpd_recipient_restrictions = check_sender_access hash:/etc/postfix/access, reject" >> "/etc/postfix/main.cf"; \
fi
stow -t "/etc/postfix" postfix
sudo chown root /etc/postfix/transport
sudo chown root /etc/postfix/access
postmap /etc/postfix/transport
postmap /etc/postfix/access
postfix reload
uninstall: # uninstall everything we've installed from this repo
stow -t "/usr/local/bin" -D bin
stow -t "/etc/templates" -D templates
stow -t "/usr/share/man/man1/" -D man
stow -t "/etc/bash_completion.d" -D completion
stow -t "/etc/efingerd" -D efingerd
stow -t "/etc" -D menu
stow -t "/etc/postfix" -D postfix
stow -t "/etc/update-motd.d" -D update-motd
stow -t "/etc" -D menu
cd files && stow -t "/usr/share/games/fortunes" -D fortunes

View File

@ -1,3 +1,36 @@
# cosmic.voyage scripts ![status](https://travis-ci.com/jamestomasino/cosmic.svg?branch=master) [![Build Status](https://drone.tildegit.org/api/badges/cosmic/cosmic/status.svg)](https://drone.tildegit.org/cosmic/cosmic)
# cosmic.voyage scripts
These are the scripts and files designed for https://cosmic.voyage. They're stored here for public review and collaboration.
## bin
For admin:
- `cosmic-backup` cron-run backup of /var/gopher to git repo
- `cosmic-rss` cron-run creation of rss feed for web and gopher
- `cosmic-ship` create a new ship and assign it to a given user
- `cosmic-user` create a new user and scaffold them into the story
- `cosmic-web` cron-run creation of html version of the story
For users:
- `cosmic-log` aliased as `log` - submit messages to the QEC relay
- `cosmic-motd` aliased as `motd` - pretty-prints the motd
- `cosmic-roster` aliased as `roster` - show current users and their ships
## files
- `motd` message of the day, records recent updates to the system
- `favicon.ico` website favicon for https://cosmic.voyage
## templates
- `web-header.tmpl` - template for web generation
- `newship.tmpl` - email template for adding new ship for user
- `welcomeemail.tmpl` - email template for new users added to system
## manpages
- `cosmic-log` aliased as `log`
## bash-completion
- `cosmic-log` aliased as `log`

View File

@ -1,80 +0,0 @@
#!/usr/bin/awk -f
BEGIN {
FS = "\t"
RS = "\n" # techincally \r\n, but servers mess this up
OFS = " "
ORS = "\n"
isFenced = 0
}
{
gsub(/\r/,"") # handle trailing windows line endings from GOOD servers
type=substr($1,1,1)
label=substr($1,2)
path=$2
server=$3
port=$4
gsub(/ /,"%20", path) # spaces in URLs work in gopher, but not gemini
if ( type == "." ) {} # end of file, don't display
else if ( type == "i" ) {
# print label only
if (label ~ /^#{1,3}\s/ ) {
# In a heading, end fence
if (isFenced) {
print "```"
isFenced=0
}
} else if (label ~ /^\*\s/) {
# In a bullet list, end fence
if (isFenced) {
print "```"
isFenced=0
}
} else {
# not in special line, fence it
if (!(isFenced)) {
print "```"
isFenced=1
}
}
print label
} else if ( type == "h") {
# html links
if (isFenced) {
# end fences for links
print "```"
isFenced=0
}
url = substr(path, 5)
printf("=> %s %s\n", url, label)
} else if ( type == "T") {
# telnet links
if (isFenced) {
# end fences for links
print "```"
isFenced=0
}
printf("=> telnet://%s:%s/%s%s %s\n", server, port, type, path, label)
} else {
# any other gopher type
if (isFenced) {
# end fences for links
print "```"
isFenced=0
}
if (server) {
printf("=> gemini://%s%s %s\n", server, path, label)
} else {
printf("=> %s %s\n", path, label)
}
}
}
END {
if (isFenced) {
# properly end fences if we're in one
print "```"
}
}

View File

@ -1,96 +0,0 @@
#!/usr/bin/env python
import argparse
import string
import random
def living():
l=["people like or unlike you",
"fish",
"dinosaurs",
"wolves",
"birds",
"giant insects"]
return random.choice(l)
def plants():
l=["towering trees"
"carnivorous pitchers",
"giant ferns",
"glowing weeds",
"floating flowers",
"oozing mushrooms"]
return random.choice(l)
def ruins():
l=["mysterious obelisks",
"vine-covered temples",
"abandoned dwellings for people bigger than you",
"a wrecked spaceship, etc."]
return random.choice(l)
def nature():
l=["huge crystal formations",
"mirages",
"vividly colored lightning",
"strange clouds",
"rocks eroded in strange shapes",
"veins of precious metals"]
return random.choice(l)
what=[{ "label": "living beings", "example": living},
{ "label": "plants or other immobile forms of life", "example": plants},
{ "label": "ruins", "example": ruins },
{ "label": "natural phenomena", "example": nature}]
where=[
"In a field taller than you",
"Under the light of the moon(s)",
"By a gentle river",
"In a steep canyon",
"In a treetop",
"On the snowy peak of a mountain",
"Near a volcano",
"On a glacier",
"Deep underground",
"On a cliff face",
"In the desert",
"In deep water",
"Floating in the air"]
difficulty=["It was arduous to get to:", "You come upon it suddenly:", "You spot it as you are resting:"]
def main():
discoveries = random.choice(range(1, 6))
name = ''.join(random.choice(string.ascii_uppercase) for _ in range(3)) + ''.join(random.choice(string.digits) for _ in range(3)) + "-" + ''.join(random.choice(string.digits) for _ in range(1))
print("Planet " + name)
print("(" + str(discoveries) + " discoveries to find)")
print("\n- - - - -\n")
for i in range(discoveries):
subject = random.choice(what)
diff = random.choice(difficulty)
print("Discovery " + str(i + 1) + ":")
print(diff + " " + random.choice(where) + " you discover " + subject["label"] + ", such as " + subject["example"]())
if (i < discoveries - 1):
print("")
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--about', action="store_true", help="About Alone Among the Stars")
args = parser.parse_args()
if args.about:
print("""Alone Among the Stars
By Takuma Okada | noroadhome.itch.io
A solo roleplaying game about exploring fantastic planets
You are a solitary adventurer, hopping from planet to planet exploring. Each
world has unique features for you to discover and record.
In your ship's log, record a short description and your reaction in a few
sentences, and move on to the next discovery. Each time you complete a planet,
give it a name if it needs one, and find a new planet.
""")
else:
main()

View File

@ -1,62 +0,0 @@
#!/bin/sh
run_user=$(id -u)
if [ "$run_user" -eq 0 ]; then
gopher_atom="/var/gopher/atom.xml"
######################################################################
########################## GOPHER VERSION ###########################
######################################################################
# Add header info to xml output
{
printf "<?xml version=\"1.0\" encoding=\"utf-8\"?>\\n"
printf "<feed xmlns=\"http://www.w3.org/2005/Atom\">\\n"
printf "<title>Cosmic Voyage</title>\\n"
printf "<subtitle>Messages from the human stellar diaspora</subtitle>\\n"
printf "<link rel=\"alternate\" href=\"gopher://cosmic.voyage/\"/>\\n"
printf "<link rel=\"self\" href=\"gopher://cosmic.voyage/atom.xml\" />\\n"
firstlog=$(head -n1 "/var/gopher/listing.gophermap" | awk -F'\t' '{print $2}')
printf "<updated>%s</updated>\\n" "$(date -d "$(stat -c %y "/var/gopher${firstlog}")" +'%Y-%m-%dT%H:%M:%SZ')"
printf "<rights>©2021 All rights reserved</rights>\\n"
printf "<id>gopher://cosmic.voyage/</id>\\n"
} > "${gopher_atom}"
xml_escape_script='s/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g; s/"/\&quot;/g; s/'"'"'/\&#39;/g'
# Loop through listings gophermap
loop=0
while read -r line; do
loop=$((loop+1))
if [ "$loop" -lt 20 ]; then
log=$(printf "%s" "$line" | awk -F'\t' '{print $2}')
title=$(printf "%s" "$line" | awk -F'\t' '{print $1}' | sed -e 's|^.||' -e "$xml_escape_script")
owner=$(stat -c %U "/var/gopher${log}")
# print item entry for each log
{
printf "<entry>\\n"
printf " <title>%s</title>\\n" "$title"
printf " <author>\\n"
printf " <name>%s</name>\\n" "$owner"
printf " </author>\\n"
printf " <link rel=\"alternate\" href=\"gopher://cosmic.voyage/0%s\"/>\\n" "$(printf "%s" "$log" | sed 's|\ |%20|g')"
printf " <id>gopher://cosmic.voyage/0%s</id>\\n" "$(printf "%s" "$log" | sed 's|\ |%20|g')"
printf " <updated>%s</updated>\\n" "$(date -d "$(stat -c %y "/var/gopher${log}")" +'%Y-%m-%dT%H:%M:%SZ')"
printf " <content type=\"html\"><![CDATA[<pre>\\n"
sed "$xml_escape_script" "/var/gopher${log}"
printf "</pre>]]></content>\\n"
printf "</entry>\\n"
} >> "${gopher_atom}"
fi
done < "/var/gopher/listing.gophermap"
# close up the footer
{
printf "</feed>\\n"
} >> "${gopher_atom}"
else
exec sudo "$0" "$@"
fi

View File

@ -1,45 +0,0 @@
#!/bin/sh
run_user=$(id -un)
if [ "$run_user" = "root" ] || [ "$run_user" = "publish" ]; then
author_index="/var/www/authors/index.html"
{
printf "<!DOCTYPE html>\\n"
printf "<html lang=\"en\">\\n"
printf " <head>\\n"
printf " <meta charset=utf-8>\\n"
printf " <meta http-equiv=X-UA-Compatible content=\"IE=edge\">\\n"
printf " <meta name=viewport content=\"shrink-to-fit=no,width=device-width,height=device-height,initial-scale=1,user-scalable=1\">\\n"
printf " <title>Cosmic Voyage - Authors</title>\\n"
printf " <link rel=\"stylesheet\" href=\"/styles.css\">\\n"
printf " <link rel=\"canonical\" href=\"https://authors.cosmic.voyage\">\\n"
printf " <meta name=\"description\" content=\"Cosmic Voyage is a public-access unix system and tilde community based around a collaborative science-fiction universe. Users write stories as the people aboard ships, colonies, and outposts, using the only remaining free, interconnected network that unites the dispersed peoples of the stars.\">\\n"
printf " </head>\\n"
printf " <body>\\n"
printf " <div class=\"page-wrapper\">\\n"
printf "<pre class=\"inner-wrapper\">\\n"
printf " _. _ __._ _ * _. . , _ . _. _ _\\n"
printf " (_.(_)_) [ | )|(_. \/ (_)\_|(_](_](/,\\n"
printf " ._| ._|\\n"
printf " , .\\n"
printf " _.. .-+-|_ _ ._ __\\n"
printf " (_](_| | [ )(_)[ _)\\n"
printf "\\n\\n"
} > "${author_index}"
web_paths="/home/*/public_html"
for i in ${web_paths}; do
if [ -d "$i" ]; then
username="$(basename "$(dirname "$i")")"
printf "* <a href=\"/~%s/\">~%s</a>\\n" "${username}" "${username}" >> "${author_index}"
fi
done
{
printf "</pre>\\n"
printf "</body>\\n"
printf "</html>"
} >> "${author_index}"
else
exec sudo -u publish "$0" "$@"
fi

View File

@ -1,10 +0,0 @@
#!/bin/sh
rsync -avzh --delete --include=".description" --exclude=".*" /var/gopher/ /var/cosmic-backup/gopher/
rsync -avzh --delete --exclude=".*" /var/wiki/ /var/cosmic-backup/wiki/
cd /var/cosmic-backup || exit
rm ./gopher/rss.xml # skip archival of rss feed
rm ./gopher/atom.xml # skip archival of atom feed
git add .
git commit -m "backup"
git push origin master

View File

@ -1,3 +0,0 @@
#!/bin/sh
/usr/bin/python3 /opt/botany/botany.py

View File

@ -1,2 +0,0 @@
#!/bin/sh
fortune | figlet -c -w 80 -f slant | nms -a

View File

@ -1,2 +0,0 @@
#!/bin/sh
/usr/bin/weechat -r "/set irc.look.temporary_servers on; /connect irc://$(whoami)@localhost:6667/#meta,#cosmic"

7
bin/cosmic-backup Executable file
View File

@ -0,0 +1,7 @@
#!/bin/sh
rsync -avzh --delete --exclude=".*" /var/gopher/ /var/cosmic-backup/gopher/
cd /var/cosmic-backup/gopher/ || exit
git add .
git commit -m 'backup'
git push origin master

266
bin/cosmic-log Executable file
View File

@ -0,0 +1,266 @@
#!/bin/sh
# TODO: create new messages for ship using templates
# TODO: better isolate listings.gophermap from accidental clobbering
SCRIPT=$(readlink -f "$0")
SCRIPTPATH=$(dirname "$SCRIPT")
die () {
msg="$1"
code="$2"
# exit code defaults to 1
if printf "%s" "$code" | grep -q '^[0-9]+$'; then
code=1
fi
# output message to stdout or stderr based on code
if [ -n "$msg" ]; then
if [ "$code" -eq 0 ]; then
printf "%s\\n" "$msg"
else
printf "%s\\n" "$msg" >&2
fi
fi
exit "$code"
}
finish () {
rm -f "$tmp"
}
trap finish EXIT
parse_input () {
if ! parsed=$(getopt "$arg_options" "$@"); then
die "Invalid input" 2
fi
eval set -- "$parsed"
while true; do
case "$1" in
-h)
flag_help=1
arg_log=0
shift
;;
-v)
flag_version=1
arg_log=0
shift
;;
-d)
flag_debug=1
arg_log=0
shift
;;
-s)
shift
arg_ship="$1"
shift
;;
-z)
flag_shortlist=1
shift
;;
-n)
arg_log=0
shift
arg_new="$1"
shift
;;
--)
shift
break
;;
*)
die "Internal error: $1" 3
;;
esac
done
}
show_help () {
printf "%s [-hvd] [-s shipname]\\n\\n" "$(basename "$0")"
printf " -h Show this help\\n"
printf " -v Show current version info\\n"
printf " -d Debug mode\\n"
printf " -s [shipname] Only log messages for ship named\\n"
printf " -n [filename] Create new message with filename\\n"
printf " (Users with multiple ships must use -s)\\n"
printf "\\n"
printf "Passing no options will enter interactive mode.\\n\\n"
printf "\\n"
}
read_key () {
_key=
if [ -t 0 ]; then
if [ -z "$_stty" ]; then
_stty=$(stty -g)
fi
stty -echo -icanon min 1
_key=$(dd bs=1 count=1 2>/dev/null)
stty "$_stty"
fi
}
yesno () {
read_key
case $_key in
y ) result=0 ;;
* ) result=1 ;;
esac
return $result
}
check_log () {
ship="$*"
printf ">> %s" "${ship}"
# look at log entries in gophermap
# compare against files in ship directory
# store list of unpublished logs
logs=$(grep "^0${ship}" "/var/gopher/listing.gophermap" | awk -F'\t' '{print $2}')
files=$(find "/var/gopher/$ship" -regex ".*\\.txt$" -not -path '*/\.*' -type f | sed 's|/var/gopher||')
uniq=$(printf "%s\\n%s" "$logs" "$files" | sort | uniq -u)
if [ -z "$uniq" ]; then
printf " .... No messages.\\n"
else
# check each unpublished message for sending
IFS='
'
for u in $uniq
do
printf "\\n Send message %s? " "$(basename "$u" | sed 's/\.[^.]*$//')"
if yesno; then
# prompt for title and prepare output
printf "\\n Title for message %s? " "$(basename "$u" | sed 's/\.[^.]*$//')"
read -r title
if [ ! -z "$title" ]; then
printf "0%s - %s\\t%s\\n" "$ship" "$title" "$u" | cat - /var/gopher/listing.gophermap > "$tmp" && cat "$tmp" > /var/gopher/listing.gophermap && rm "$tmp"
printf "\\n %s - %s .... Sent.\\n" "$(basename "$u" | sed 's/\.[^.]*$//')" "$title"
else
printf " %s .... No title, abort.\\n" "$(basename "$u" | sed 's/\.[^.]*$//')"
fi
else
printf "\\n %s .... Skipped.\\n" "$(basename "$u" | sed 's/\.[^.]*$//')"
fi
done
unset IFS
fi
}
new_message () {
ship="$1"
post_file="/var/gopher/${ship}/${2}"
template_file="/var/gopher/${ship}/.template"
temp_post=$(mktemp -t "$(basename "$0").post.XXXXXXX") || die "Failed to create temporary file" 1
if [ -f "$post_file" ]; then
cp "$post_file" "$temp_post"
elif [ -f "$template_file" ]; then
cp "$template_file" "$temp_post"
fi
temp_post_time=$(stat -c %Y "$temp_post")
${EDITOR:-nano} "$temp_post"
temp_post_time_check=$(stat -c %Y "$temp_post")
if [ "$temp_post_time" -ne "$temp_post_time_check" ] ; then
printf "Drafted message %s (%s)\\n" "$2" "$1"
touch "${post_file}"
cat "${temp_post}" > "${post_file}"
rm "${temp_post}"
else
printf "Aborted message.\\n"
rm "${temp_post}"
fi
}
main() {
parse_input "$@"
# debug
if [ $flag_debug -gt 0 ]; then
set -x
fi
# shortlist for bash completion
if [ $flag_shortlist -gt 0 ]; then
out="$ships"
die "${out}" 0
fi
# version
if [ $flag_version -gt 0 ]; then
printf "%s\\n" "$version"
fi
# print help
if [ $flag_help -gt 0 ]; then
show_help
fi
# standard log if no params
if [ $arg_log -gt 0 ]; then
printf "INITIALIZING QEC...\\n"
printf "Ready to transmit for [%s]\\n" "${user}"
if [ "$numships" -eq 0 ]; then
printf "No registered ships found in system.\\n"
elif [ "$numships" -eq 1 ]; then
if [ -z "$arg_ship" ] || [ "$ships" = "$arg_ship" ]; then
check_log "$ships"
fi
else
IFS='
'
for f in $ships
do
if [ -z "$arg_ship" ] || [ "$f" = "$arg_ship" ]; then
check_log "$(basename "$f")"
fi
done
unset IFS
fi
fi
# new message
if [ ! -z "$arg_new" ]; then
if [ "$numships" -eq 0 ]; then
printf "No registered ships found in system.\\n"
elif [ "$numships" -eq 1 ]; then
if [ -z "$arg_ship" ] || [ "$ships" = "$arg_ship" ]; then
new_message "$ships" "$arg_new"
fi
else
IFS='
'
for f in $ships
do
if [ "$f" = "$arg_ship" ]; then
new_message "$arg_ship" "$arg_new"
fi
done
unset IFS
fi
fi
}
##############################################################################
##############################################################################
##############################################################################
version="0.1.0"
user=$(whoami)
ships=$(find /var/gopher -user "$user" -type d -exec basename {} \;)
numships=$(echo "${ships}" | wc -l)
tmp=$(mktemp -t "$(basename "$0").tmp.XXXXXXX") || die "Failed to create temporary file" 1
flag_help=0
flag_version=0
flag_debug=0
flag_shortlist=0
arg_options="hvds:zn:"
arg_log=1
arg_ship=""
arg_new=""
main "$@"

3
bin/cosmic-motd Executable file
View File

@ -0,0 +1,3 @@
#!/bin/sh
lolcat /etc/motd

View File

@ -14,13 +14,13 @@ temp_roster=$(mktemp -t "$(basename "$0").roster.XXXXXXX") || exit 1
find "/var/gopher/" -maxdepth 1 ! -path "/var/gopher/" ! -path "/var/gopher/ships" ! -path "/var/gopher/log" -type d | while read -r shipdir
do
owner=$(stat -c %U "$shipdir")
printf "%s%%%%%s\\n" "$owner" "$(basename "$shipdir")" >> "$temp_roster"
printf "%s|%s\\n" "$owner" "$(basename "$shipdir")" >> "$temp_roster"
done
if [ "$#" -ne 1 ]; then
sort "$temp_roster" | column -s "%%" -t
sort "$temp_roster" | column -s "|" -t
elif [ "$1" = "count" ]; then
sort "$temp_roster" | awk -F "%%" '{print $1}' | uniq -c
sort "$temp_roster" | awk 'FS="|" {print $1}' | uniq -c
else
sort "$temp_roster" | column -s "%%" -t | grep -i "$*"
sort "$temp_roster" | column -s "|" -t | grep -i "$*"
fi

91
bin/cosmic-rss Executable file
View File

@ -0,0 +1,91 @@
#!/bin/sh
run_user=$(id -u)
if [ "$run_user" -eq 0 ]; then
file_rss="/var/www/html/rss.xml"
gopher_rss="/var/gopher/rss.xml"
######################################################################
############################# HTML VERSION ###########################
######################################################################
# Add header info to xml output
{
printf '<?xml version="1.0"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel>'
printf '<atom:link href="https://cosmic.voyage/rss.xml" rel="self" type="application/rss+xml" />'
printf "\\n<title>Cosmic Voyage</title>\\n"
printf "<link>https://cosmic.voyage</link>\\n"
printf "<description>Messages from the human stellar diaspora</description>\\n"
} > "${file_rss}"
# Loop through listings gophermap
while read -r line; do
log=$(printf "%s" "$line" | awk -F'\t' '{print $2}')
title=$(printf "%s" "$line" | awk -F'\t' '{print $1}' | sed 's|^.||')
owner=$(stat -c %U "/var/gopher${log}")
# print item entry for each log
{
printf "<item>\\n"
printf " <title>%s</title>\\n" "$title"
printf " <author>%s@cosmic.voyage (%s)</author>\\n" "$owner" "$owner"
printf " <link>https://cosmic.voyage%s</link>\\n" "$(printf "%s" "$log" | sed 's|.txt$|.html|' | sed 's|\ |%20|')"
printf " <guid>https://cosmic.voyage%s</guid>\\n" "$(printf "%s" "$log" | sed 's|.txt$|.html|' | sed 's|\ |%20|')"
printf " <pubDate>%s GMT</pubDate>\\n" "$(date -d "$(stat -c %y "/var/gopher${log}")" +'%a, %d %b %Y %H:%M:%S')"
printf " <description><![CDATA[<pre>\\n"
sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g; s/"/\&quot;/g; s/'"'"'/\&#39;/g' "/var/gopher${log}"
printf "</pre>]]></description>\\n"
printf "</item>\\n"
} >> "${file_rss}"
done < "/var/gopher/listing.gophermap"
# close up the footer
{
printf "</channel>\\n"
printf "</rss>\\n"
} >> "${file_rss}"
######################################################################
########################## GOPHER VERSION ###########################
######################################################################
# Add header info to xml output
{
printf '<?xml version="1.0"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel>'
printf '<atom:link href="gopher://cosmic.voyage/0/rss.xml" rel="self" type="application/rss+xml" />'
printf "\\n<title>Cosmic Voyage</title>\\n"
printf "<link>gopher://cosmic.voyage</link>\\n"
printf "<description>Messages from the human stellar diaspora</description>\\n"
} > "${gopher_rss}"
# Loop through listings gophermap
while read -r line; do
log=$(printf "%s" "$line" | awk -F'\t' '{print $2}')
title=$(printf "%s" "$line" | awk -F'\t' '{print $1}' | sed 's|^.||')
owner=$(stat -c %U "/var/gopher${log}")
# print item entry for each log
{
printf "<item>\\n"
printf " <title>%s</title>\\n" "$title"
printf " <author>%s@cosmic.voyage (%s)</author>\\n" "$owner" "$owner"
printf " <link>gopher://cosmic.voyage/0%s</link>\\n" "$log"
printf " <guid>gopher://cosmic.voyage/0%s</guid>\\n" "$log"
printf " <pubDate>%s GMT</pubDate>\\n" "$(date -d "$(stat -c %y "/var/gopher${log}")" +'%a, %d %b %Y %H:%M:%S')"
printf " <description><![CDATA[\\n"
cat "/var/gopher${log}"
printf "]]></description>\\n"
printf "</item>\\n"
} >> "${gopher_rss}"
done < "/var/gopher/listing.gophermap"
# close up the footer
{
printf "</channel>\\n"
printf "</rss>\\n"
} >> "${gopher_rss}"
else
exec sudo "$0" "$@"
fi

41
bin/cosmic-ship Executable file
View File

@ -0,0 +1,41 @@
#!/bin/sh
run_user=$(id -u)
if [ "$run_user" -eq 0 ]; then
n="$1"
s="$2"
if [ ! -z "$n" ]; then
user_exists=$(id -u "${n}" 2> /dev/null)
if [ ! -z "${user_exists}" ]; then
if [ ! -z "${s}" ]; then
path="/var/gopher/${s}"
if [ ! -d "$path" ]; then
printf "Creating ship '%s' for user '%s'\\n" "${s}" "${n}"
# create ship directory in gopher and give ownership to user
mkdir "$path"
chmod 755 "$path"
chown -R "${n}" "$path"
# create ship listings dir and link to ship gophermap
mkdir "/var/gopher/ships/${s}"
ln -s "/var/gopher/ships/ship/gophermap" "/var/gopher/ships/${s}/gophermap"
# create a symlink in user's home dir for easy access
mkdir -p "/home/${n}/ships"
ln -s "$path" "/home/${n}/ships/${s}"
# notify user by email
sed -e "s/username/${n}/g" -e "s/shipname/${s}/" /etc/newship.tmpl | sendmail "${n}" "tomasino"
else
owner=$(stat -c %U "$path")
printf "That ship or colony already exists and is owned by %s\\n" "$owner"
fi
else
printf "Specificy a ship or colony name.\\n"
fi
else
printf "User not found.\\n"
fi
else
printf "Specify a user.\\n"
fi
else
exec sudo "$0" "$@"
fi

View File

@ -3,18 +3,18 @@
run_user=$(id -u)
if [ "$run_user" -eq 0 ]; then
n="$1"
k="$2"
if [ -n "$n" ]; then
# create user
e="$2"
k="$3"
if [ ! -z "$n" ]; then
user_exists=$(id -u "${n}" 2> /dev/null)
if [ -z "${user_exists}" ]; then
printf "Adding new user %s\\n" "${n}"
newpw=$(pwgen -1B 10)
pwcrypt=$(perl -e "print crypt('${newpw}', 'sa');")
useradd -m -G users,www-data -p "$pwcrypt" -s /bin/bash "${n}" || exit 1
sed -e "s/USERNAME/${n}/g" -e "s/PASSWORD/${newpw}/" /etc/templates/welcomemail.tmpl | sendmail "${n}"
sed -e "s/newusername/${n}/g" -e "s/newpassword/${newpw}/" /etc/welcomemail.tmpl | sendmail "${n}" "${e}" "tomasino"
fi
if [ -n "${k}" ]; then
if [ ! -z "${k}" ]; then
printf "%s\\n" "${k}" >> "/home/${n}/.ssh/authorized_keys"
else
${EDITOR:-vim} "/home/${n}/.ssh/authorized_keys"

172
bin/cosmic-web Executable file
View File

@ -0,0 +1,172 @@
#!/bin/sh
entry_index () {
line="$1"
index=$2
log=$(printf "%s" "$line" | awk -F'\t' '{print $2}')
loghtml=$(printf "%s" "$log" | sed 's/\.[^.]*$//')
logdir=$(dirname "$log")
title=$(printf "%s" "$line" | awk -F'\t' '{print $1}' | sed 's|^.||')
# print link in listings
if [ $index -lt 20 ]; then
printf "<a href=\"%s.html\">>> %s</a>\\n" "$loghtml" "$title" >> "${file_html}"
fi
printf "<a href=\"%s.html\">>> %s</a>\\n" "$loghtml" "$title" >> "${log_html}"
# create entry
entry_html="${html_dir}${loghtml}.html"
mkdir -p "${html_dir}${logdir}"
cat "$web_header_html" > "${entry_html}"
{
printf " <title>%s</title>\\n" "$title"
printf " <link rel=\"canonical\" href=\"https://cosmic.voyage%s.html\">\\n" "$loghtml"
printf "</head>\\n<body>\\n<div class=\"page-wrapper\"><pre class=\"inner-wrapper\">\\n"
printf "<a href=\"/log\">&lt;&lt; BACK TO RELAY ONE LOG</a>\\n\\n\\n"
sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g; s/"/\&quot;/g; s/'"'"'/\&#39;/g' "${gopher_dir}${log}"
# close up the entry footer
printf "</pre></div></body></html>"
} >> "${entry_html}"
}
run_user=$(id -u)
if [ "$run_user" -eq 0 ]; then
SCRIPT=$(readlink -f "$0")
SCRIPTPATH=$(dirname "$SCRIPT")
file_html="/var/www/html/index.html"
log_html="/var/www/html/log/index.html"
web_header_html="${SCRIPTPATH}/../templates/webheader.tmpl"
ships_html="/var/www/html/ships/index.html"
error_html="/var/www/html/error.html"
html_dir="/var/www/html"
gopher_dir="/var/gopher"
# Clear web folder
rm -rf "${html_dir:-/var/www/html}/*"
# Generate RSS
# shellcheck source=cosmic-rss
. "${SCRIPTPATH}/cosmic-rss"
# prep directories
mkdir -p "$(dirname "${log_html}")"
# Add standard header
cat "$web_header_html" > "${file_html}"
cat "$web_header_html" > "${log_html}"
# Custom header elements and body start
{
printf "<title>Cosmic Voyage</title>"
printf "<link rel=\"canonical\" href=\"https://cosmic.voyage\">"
printf "<link rel=\"alternate\" type=\"application/rss+xml\" title=\"Cosmic Voyage\" href=\"/rss.xml\">"
printf "</head>"
printf "<body>"
printf "<div class=\"page-wrapper\">"
printf "<pre class=\"inner-wrapper\">"
# Intro text
cat "${gopher_dir}/intro.gophermap"
# Ship listings
printf "\\n<a href=\"/log\">>> Complete Transmission Log</a>\\n"
printf "<a href=\"/ships\">>> Ships, Colonies, Outposts</a>\\n"
printf "<a href=\"/rss.xml\">>> RSS Feed</a>\\n\\n"
# Logs
printf "Most recent (20) log entries:\\n"
} >> "${file_html}"
# Custom header elements and body start
{
printf "<title>Cosmic Voyage - Transmission Log</title>"
printf "<link rel=\"canonical\" href=\"https://cosmic.voyage/log\">"
printf "</head>"
printf "<body>"
printf "<div class=\"page-wrapper\">"
printf "<pre class=\"inner-wrapper\">"
printf "<a href=\"/\">&lt;&lt; BACK TO RELAY ONE</a>\\n\\n"
# Intro text
cat "${gopher_dir}/log/intro.gophermap"
} >> "${log_html}"
# Loop through listings gophermap
loop=0
while read -r line; do
loop=$((loop+1))
entry_index "$line" $loop
done < "${gopher_dir}/listing.gophermap"
# footer
{
printf "</pre>\\n"
printf "</div>\\n"
printf "</body>\\n"
printf "</html>"
} | tee -a "${log_html}" >> "${file_html}"
# Generate ship pages
mkdir -p "${html_dir}/ships"
# Add header info to html output
cat "$web_header_html" > "${ships_html}"
# Custom header elements and body start
{
printf "<title>Cosmic Voyage - Ships</title>"
printf "<link rel=\"canonical\" href=\"https://cosmic.voyage/ships\">"
printf "</head>"
printf "<body>"
printf "<div class=\"page-wrapper\">"
printf "<pre class=\"inner-wrapper\">"
printf "<a href=\"/\">&lt;&lt; BACK TO RELAY ONE</a>\\n"
ship_intro="${gopher_dir}/ships/ships.gophermap"
if [ -f "$ship_intro" ]; then
cat "$ship_intro"
printf "\\n"
fi
} >> "${ships_html}"
# Add header info to html output
find "${gopher_dir}/" -maxdepth 1 ! -path "${gopher_dir}/" ! -path "${gopher_dir}/ships" ! -path "${gopher_dir}/log" -type d -print | sed 's|/var/gopher/||' | sort | while read -r ship
do
entry_num=$(grep -c "^0${ship}" "${gopher_dir}/listing.gophermap")
if [ "$entry_num" != "0" ]; then
printf "<a href=\"/ships/%s/\">>> %s (%s)</a>\\n" "$ship" "$ship" "$entry_num" >> "$ships_html"
# Create individual ship log page
ship_html="${html_dir}/ships/${ship}/index.html"
mkdir -p "${html_dir}/ships/${ship}"
# Add header info to html output
cat "$web_header_html" > "${ship_html}"
# Custom header elements and body start
{
printf "<title>Cosmic Voyage - %s</title>" "$ship"
printf "<link rel=\"canonical\" href=\"https://cosmic.voyage/ships/%s\">" "$ship"
printf "</head>"
printf "<body>"
printf "<div class=\"page-wrapper\">"
printf "<pre class=\"inner-wrapper\">"
# Contents
printf "<a href=\"/ships\">&lt;&lt; BACK TO RELAY ONE SHIP LIST</a>\\n\\n\\n"
desc="${gopher_dir}/${ship}/.description"
if [ -f "$desc" ]; then
cat "$desc"
printf "\\n"
fi
printf "%s - Ship Log\\n" "$ship"
grep "^0${ship}" "${gopher_dir}/listing.gophermap" | sed "s|0${ship} - ||" | awk -F"\\t" '{f=$2; gsub(".txt", ".html", f); printf "<a href=\"%s\">>> %s</a>\n", f, $1}'
printf "</div></body></html>"
} >> "${ship_html}"
fi
done
# Footer
{
printf "</div>\\n"
printf "</body>\\n"
printf "</html>"
} >> "${ships_html}"
# Print error page
cat "$web_header_html" > "${error_html}"
{
printf "</head><body><div class=\"page-wrapper\"><pre class=\"inner-wrapper\"><a href=\"/\">&lt;&lt; BACK TO RELAY ONE</a>"
printf "\\n\\n\\nERROR. TRANSMISSION NOT FOUND.</pre></div></body></html>"
} >> "${error_html}"
# copy favicon
cp "${SCRIPTPATH}/../files/favicon.ico" "${html_dir}"
else
exec sudo "$0" "$@"
fi

View File

@ -1,27 +0,0 @@
#!/bin/sh
all_users=$(grep -E '1[0-9]{3}' "/etc/passwd" | grep 'home' | awk -F":" '{print $1}')
finish () {
if [ -f "$temp_shiplist" ]; then
rm "$temp_shiplist"
fi
}
trap finish EXIT
# use temp file for accumulator
temp_shiplist=$(mktemp -t "$(basename "$0").shiplist.XXXXXXX") || exit 1
# find all ship folders
find "/var/gopher/" -maxdepth 1 ! -path "/var/gopher/" ! -path "/var/gopher/ships" ! -path "/var/gopher/log" -type d | while read -r shipdir
do
owner=$(stat -c %U "$shipdir")
printf "%s\\n" "$owner" >> "$temp_shiplist"
done
sort "$temp_shiplist" | uniq -c | sort -k1,1nr -k2,2n | awk '{print $1, $2}'
for u in $all_users; do
if ! grep -q "$u" "$temp_shiplist"; then
printf "0 %s\\n" "$u"
fi
done

View File

@ -1,29 +0,0 @@
#!/bin/sh
puzChoice="$1"
localPuzzleDir="$HOME/.puzzles"
systemPuzzleDir="/var/puzzles"
if [ -n "$puzChoice" ]; then
if [ "$puzChoice" = "-h" ]; then
printf "Run program without arguments for list of puzzles. Add puzzle name as argument to start puzzle.\\n"
else
sysPuzChoiceFile="${systemPuzzleDir}/${puzChoice}.puz"
localPuzChoiceFile="${localPuzzleDir}/${puzChoice}.puz"
if [ -f "$sysPuzChoiceFile" ]; then
if [ ! -f "$localPuzChoiceFile" ]; then
mkdir -p "$localPuzzleDir"
cp "$sysPuzChoiceFile" "$localPuzChoiceFile"
fi
cursewords "$localPuzChoiceFile"
else
printf "puzzle not found.\\n"
fi
fi
else
for f in "${systemPuzzleDir}"/*.puz; do
puzzleFilename=$(basename "$f")
puzzleName=${puzzleFilename%.*}
printf "%s\\n" "$puzzleName"
done
fi

View File

@ -1,10 +0,0 @@
#!/bin/sh
SOURCEKEY="https://crawl.tildeverse.org/dcss.key"
MYKEY="${HOME}/.ssh/dcss.key"
if [ ! -f "$MYKEY" ]; then
mkdir -p "${HOME}/.ssh"
curl -s "$SOURCEKEY" > "$MYKEY"
chmod 600 "$MYKEY"
fi
ssh -i "$MYKEY" dcss@crawl.tildeverse.org

View File

@ -1,4 +0,0 @@
#!/bin/sh
sdcv -n --utf8-output --color "$@" 2>&1 | \
fold --width="$(tput cols)" | \
less -FRX

View File

@ -1,31 +0,0 @@
#!/bin/sh
meta="/var/cosmic/files/metadata.yml"
ebook="$HOME/cosmic.txt"
epub="$HOME/cosmic.epub"
intro="/var/gopher/intro.gophermap"
filelist=$(tac /var/gopher/listing.gophermap)
if [ -f "$ebook" ]; then
rm "$ebook"
fi
printf "# Introduction\\n\\n" >> "$ebook"
sed 's/^/ /' "$intro" >> "$ebook"
IFS='
'
for log in $filelist; do
file=$(printf "%s" "$log" | awk -F"\\t" '{print "/var/gopher" $2}')
title=$(printf "%s" "$log" | awk -F"\\t" '{print $1}' | sed 's/^.//')
{
printf "# %s\\n\\n" "$title"
sed 's/^/ /' "$file"
} >> "$ebook"
done
pandoc -f markdown+hard_line_breaks -o "$epub" "$meta" --wrap=none --toc "$ebook"
rm "$ebook"

View File

@ -1,2 +0,0 @@
#!/bin/sh
/usr/bin/lynx -display_charset=utf8 --lss=/dev/null /var/wiki/faq.html

View File

@ -1,16 +0,0 @@
#!/bin/sh
# This script will eventually unban everyone in f2b-sshd
# but I need people in jail to test the next part. For
# now, it'll list the IPs of the banned folks so I can
# unban them more easily.
run_user=$(id -u)
if [ "$run_user" -eq 0 ]; then
r="$(/sbin/iptables -L f2b-sshd -n | grep REJECT)"
if [ -n "$r" ]; then
printf "%s" "$r" | awk '{print $4}' | xargs /usr/bin/fail2ban-client set sshd unbanip
fi
else
exec sudo "$0" "$@"
fi

View File

@ -1,9 +0,0 @@
#!/bin/sh
logcount=$(wc -l "/var/gopher/listing.gophermap" | awk '{print $1}')
if [ -z "$1" ] || [ "$1" -eq "$1" ] 2>/dev/null
then
awk -v tot="${logcount}" '{gsub("^0",tot-NR+1" >> ",$0);print $0}' "/var/gopher/listing.gophermap" | sed "s|\\t.*||" | head -n "${1:-5}"
else
awk -v tot="${logcount}" '{gsub("^0",tot-NR+1" >> ",$0);print $0}' "/var/gopher/listing.gophermap" | grep -i "$*" | sed "s|\\t.*||" | head -n 5
fi

293
bin/log
View File

@ -1,293 +0,0 @@
#!/bin/sh
die () {
msg="$1"
code="$2"
# exit code defaults to 1
if printf "%s" "$code" | grep -q '^[0-9]+$'; then
code=1
fi
# output message to stdout or stderr based on code
if [ -n "$msg" ]; then
if [ "$code" -eq 0 ]; then
printf "%s\\n" "$msg"
else
printf "%s\\n" "$msg" >&2
fi
fi
exit "$code"
}
finish () {
rm -f "$tmp"
}
trap finish EXIT
parse_input () {
while getopts "$arg_options" opt; do
case "$opt" in
h)
flag_help=1
arg_log=0
;;
v)
flag_version=1
arg_log=0
;;
d)
flag_debug=1
arg_log=0
;;
c)
flag_nocolor=1
;;
s)
arg_ship="$OPTARG"
;;
z)
flag_shortlist=1
;;
f)
arg_log=0
flag_file=1
flag_nocolor=1
arg_file="$OPTARG"
;;
t)
flag_title=1
arg_title="$OPTARG"
;;
*)
die "Internal error: $1" 3
;;
esac
done
}
show_help () {
printf "%s [-hvd] [-s shipname]\\n\\n" "$(basename "$0")"
printf " -h Show this help\\n"
printf " -v Show current version info\\n"
printf " -c No-Color mode\\n"
printf " -s [shipname] Only log messages for ship named\\n"
printf " -n [filename] Create new message with filename\\n"
printf " (Users with multiple ships must use -s)\\n"
printf "\\n"
}
yesno () {
old_stty_cfg=$(stty -g)
stty raw -echo
yn=$(while ! head -c 1 | grep -i '[ny]'; do true; done)
stty "$old_stty_cfg"
case $yn in
y ) result=0 ;;
* ) result=1 ;;
esac
return $result
}
check_log () {
ship="$*"
printf ">> %s" "${YELLOW}${ship}${RESET}"
# look at log entries in gophermap
# compare against files in ship directory
# store list of unpublished logs
logs=$(grep "^0${ship}" "/var/gopher/listing.gophermap" | awk -F'\t' '{print $2}')
files=$(find "/var/gopher/$ship" -regex ".*\\.txt$" -not -path '*/\.*' -type f | sed 's|/var/gopher||')
uniq=$(printf "%s\\n%s" "$logs" "$files" | sort | uniq -u)
if [ -z "$uniq" ]; then
printf " .. No new messages.\\n"
else
printf "\\n" # break to new line for each message query
# check each unpublished message for sending
IFS='
'
for u in $uniq
do
if [ -z "${u##*\#*}" ] ;then
printf " ${RED}Warning!${RESET} Message title [%s] contains illegal character \"#\". Skipping.\\n" "$(basename "$u" | sed 's/\.[^.]*$//')"
else
printf " Send [%s%s%s]? " "${YELLOW}" "$(basename "$u" | sed 's/\.[^.]*$//')" "${RESET}"
if yesno; then
# prompt for title and prepare output
printf ".. %sYES%s.\\n" "${GREEN}" "${RESET}"
# check for UTF compatability or fail
if iconv -f UTF-8 "/var/gopher${u}" > /dev/null 2> /dev/null; then
if [ "$(wc -L < "/var/gopher${u}")" -gt 80 ]; then
printf " ${RED}Warning!${RESET} Message [%s] exceeds 80 columns.\\n" "$(basename "$u" | sed 's/\.[^.]*$//')"
fi
get_title
else
printf " Message [%s] is not encoded in UTF-8. %sABORT%s\\n" "$(basename "$u" | sed 's/\.[^.]*$//')" "${RED}" "${RESET}"
fi
else
printf ".. %sNO%s.\\n" "${RED}" "${RESET}"
fi
fi
done
unset IFS
fi
}
get_title () {
printf " Title for [%s%s%s] (null exits): " "${YELLOW}" "$(basename "$u" | sed 's/\.[^.]*$//')" "${RESET}"
read -r title
if [ -z "$title" ]; then
printf " .. No title. %sABORT%s.\\n" "${RED}" "${RESET}"
return
else
title=$(printf "%s" "$title" | cut -c -60)
printf " .. Confirm title [%s%s%s]? " "${YELLOW}" "$title" "${RESET}"
if yesno; then
printf ".. %sYES%s.\\n" "${GREEN}" "${RESET}"
if printf "%s" "$title" | grep -Pq "^[\\x20-\\x7E]*$"; then
printf "0%s - %s\\t%s\\n" "$ship" "$title" "$u" | cat - /var/gopher/listing.gophermap > "$tmp" && cat "$tmp" > /var/gopher/listing.gophermap && rm "$tmp"
printf " .. [%s] .. %sSENT%s.\\n" "$title" "${GREEN}" "${RESET}"
else
printf " .. Titles must be ASCII characters. %sTry Again%s.\\n" "${RED}" "${RESET}"
get_title
fi
else
printf ".. %sNO%s.\\n" "${RED}" "${RESET}"
get_title
fi
fi
}
contains() {
string="$1"
substring="$2"
if test "${string#*$substring}" != "$string"
then
return 0 # $substring is in $string
else
return 1 # $substring is not in $string
fi
}
main() {
run_user=$(id -un)
if [ "$run_user" = "root" ] || [ "$run_user" = "publish" ]; then
# if running as publish, check who sudoed and create ship for that user
user="$SUDO_USER"
else
user="$run_user"
fi
version="0.1.1"
user="$SUDO_USER"
ships=$(find /var/gopher -maxdepth 1 -user "$user" -type d -exec basename {} \;)
numships=$(echo "${ships}" | wc -l)
tmp=$(mktemp -t "$(basename "$0").tmp.XXXXXXX") || die "Failed to create temporary file" 1
flag_help=0
flag_version=0
flag_debug=0
flag_shortlist=0
flag_file=0
flag_title=0
flag_nocolor=0
arg_options="hvdct:f:s:z"
arg_log=1
arg_ship=""
arg_file=""
arg_title=""
parse_input "$@"
if [ $flag_nocolor -gt 0 ]; then
YELLOW=""
GREEN=""
RED=""
RESET=""
else
YELLOW="$(tput setaf 12)"
GREEN="$(tput setaf 10)"
RED="$(tput setaf 9)"
RESET="$(tput sgr0)"
fi
# debug
if [ $flag_debug -gt 0 ]; then
set -x
fi
# shortlist for bash completion
if [ $flag_shortlist -gt 0 ]; then
out="$ships"
die "${out}" 0
fi
# version
if [ $flag_version -gt 0 ]; then
printf "%s\\n" "$version"
fi
# print help
if [ $flag_help -gt 0 ]; then
show_help
fi
# standard log if no params
if [ $arg_log -gt 0 ]; then
printf "%sINITIALIZING QEC%s .. %sGOOD%s\\n" "${YELLOW}" "${RESET}" "${GREEN}" "${RESET}"
printf "Ready to transmit for [%s]\\n" "${GREEN}${user}${RESET}"
if [ "$numships" -eq 0 ]; then
printf "No registered ships found in system.\\n"
elif [ "$numships" -eq 1 ]; then
if [ -z "$arg_ship" ] || [ "$ships" = "$arg_ship" ]; then
check_log "$ships"
fi
else
IFS='
'
for f in $ships
do
if [ -z "$arg_ship" ] || [ "$f" = "$arg_ship" ]; then
check_log "$(basename "$f")"
fi
done
unset IFS
fi
fi
# handle -f switch
if [ $flag_file -gt 0 ]; then
if [ -r "$arg_file" ]; then
owner=$(stat -c %U "$arg_file")
if [ "$user" = "$owner" ]; then
# if file exists and user owns it
realfile=$(readlink -f "$arg_file")
for ship in $ships
do
if contains "$realfile" "/var/gopher/${ship}"; then
if [ "$(wc -L < "$realfile")" -lt 81 ]; then
# looking for -t titles only for now
if [ $flag_title -gt 0 ]; then
if printf "%s" "$arg_title" | grep -Pq "^[\\x20-\\x7E]*$"; then
gopherfile="$(printf "%s" "$realfile" | sed 's|/var/gopher||')"
printf "0%s - %s\\t%s\\n" "$ship" "$arg_title" "$gopherfile" | cat - /var/gopher/listing.gophermap > "$tmp" && cat "$tmp" > /var/gopher/listing.gophermap && rm "$tmp"
fi
fi
fi
fi
done
fi
fi
fi
}
##############################################################################
##############################################################################
##############################################################################
run_user=$(id -un)
if [ "$run_user" = "root" ] || [ "$run_user" = "publish" ]; then
main "$@"
else
exec sudo -u publish "$0" "$@"
fi

View File

@ -1,2 +0,0 @@
#!/bin/sh
/usr/local/bin/pdmenu -c /etc/pdmenurc

View File

@ -1,25 +0,0 @@
#!/usr/bin/env bash
shopt -s nullglob
for ship in "${HOME}/ships/"*; do
shipname="$(basename "$ship")"
shipstub="$(basename "$ship" | sed 's/[^A-Za-z0-9]//g' | tr '[:upper:]' '[:lower:]')"
printf "menu:%s:Write a message from %s:New message\\n" "${shipstub}" "${shipname}"
printf " exec:Compose a new message..:edit:${EDITOR:-jed} \"%s/~filename (ending in .txt):~\"\\n" "$ship"
printf " exec:Edit Ship Description::${EDITOR:-jed} \"%s\"\\n" "${ship}/.description"
printf "nop\\n"
for log in "${ship}/"*; do
logname="$(basename "${log}")"
printf " exec:Edit\\: %s::${EDITOR:-jed} \"%s\"\\n" "$logname" "$log"
done
printf " nop\\n"
printf " exit:_Back to main menu..\\n"
done
printf "menu:write:Write a message from which ship?:Author a new message from one of your ships\\n"
for ship in "${HOME}/ships/"*; do
shipname="$(basename "$ship")"
shipstub="$(basename "$ship" | sed 's/[^A-Za-z0-9]//g' | tr '[:upper:]' '[:lower:]')"
printf " show:%s..::%s\\n" "$shipname" "$shipstub"
done
printf " nop\\n"
printf " exit:_Back to main menu..\\n"

View File

@ -1,46 +0,0 @@
#!/bin/sh
run_user=$(id -u)
if [ "$run_user" -eq 0 ]; then
n="$1"
s="$2"
newship="$3"
if [ -n "$n" ]; then
user_exists=$(id -u "${n}" 2> /dev/null)
if [ -n "${user_exists}" ]; then
if [ -n "${s}" ]; then
path="/var/gopher/${s}"
if [ -d "$path" ]; then
if [ -n "${newship}" ]; then
newpath="/var/gopher/${newship}"
ship_exists=$(find /var/gopher -maxdepth 1 -iname "$newship")
if [ -z "$ship_exists" ]; then
printf "Rename ship '%s' to '%s' for user '%s'\\n" "${s}" "${newship}" "${n}"
mv "$path" "$newpath"
mv "/var/gopher/ships/${s}" "/var/gopher/ships/${newship}"
rm "/home/${n}/ships/${s}"
ln -s "$path" "/home/${n}/ships/${newship}"
else
owner=$(stat -c %U "$ship_exists")
printf "That ship or colony already exists and is owned by %s\\n" "$owner"
fi
else
printf "Please provide a new ship name.\\n"
fi
else
printf "No ship by that name exists.\\n"
fi
else
printf "Specify a ship or colony name.\\n"
fi
else
printf "User not found.\\n"
fi
else
printf "Specify a user.\\n"
fi
else
exec sudo "$0" "$@"
fi

View File

@ -1,5 +0,0 @@
#!/bin/sh
if [ -n "$1" ]; then
fort="$*"
printf "%s\\n%%\\n" "$fort" >> /usr/share/games/fortunes/cosmic
fi

View File

@ -1,7 +0,0 @@
#!/bin/sh
if [ ! -f "$HOME/.jnewsrc" ]; then
# need to create newsrc
slrn --create
fi
slrn -d
slrn

View File

@ -1,27 +0,0 @@
#!/bin/sh
SCRIPT=$(readlink -f "$0")
SCRIPTPATH=$(dirname "$SCRIPT")
# check disk space
disk_percent=$(df -h | grep vda1 | awk '{print $5}')
if [ "$(printf "%s" "$disk_percent" | sed "s/%//")" -gt 90 ] ; then
sed -e "s/THING/disk/g" "${SCRIPTPATH}/../templates/notify.tmpl" | sed "s/PERCENT/${disk_percent}/g" | sendmail "root"
fi
# check ram usage
freemem=$(free -m | grep ^Mem | awk '{print $7}')
totalmem=$(free -m | grep ^Mem | awk '{print $2}')
memory_percent=$((100 * freemem / totalmem))
memory_percent=$((100 - memory_percent))
if [ "$memory_percent" -gt 90 ] ; then
sed -e "s/THING/memory/g" "${SCRIPTPATH}/../templates/notify.tmpl" | sed "s/PERCENT/${memory_percent}%/g" | sendmail "root"
fi
# check cpu ussage
cpu_use=$(mpstat | tail -n 1 | awk '{print $12}')
cpu_use_round=$(printf "%.*f\\n" 0 "$cpu_use")
cpu_use_round=$((100 - cpu_use_round))
if [ "$cpu_use_round" -gt 90 ] ; then
sed -e "s/THING/cpu/g" "${SCRIPTPATH}/../templates/notify.tmpl" | sed "s/PERCENT/${cpu_use_round}%/g" | sendmail "root"
fi

View File

@ -1,18 +0,0 @@
#!/bin/bash
# projects inspried by "spotlight" by gtlsgamr on tilde.team
project_path="/home/*/.project"
blue="$(tput setaf 12)"
reset_color="$(tput sgr0)"
{
for i in $project_path; do
if [ -f "$i" ]; then
username="$(basename "$(dirname "$i")")"
printf "%s---------------------------------%s\n" "$blue" "$reset_color"
printf "%s- %s%s\n" "$blue" "$username" "$reset_color"
printf "%s---------------------------------%s\n" "$blue" "$reset_color"
fold -w 80 -s "$i"
printf "\n\n"
fi
done
} | more

View File

@ -1,2 +0,0 @@
#!/bin/sh
/usr/local/bin/phetch gopher://cosmic.voyage

View File

@ -1,7 +0,0 @@
#!/bin/sh
start_date="2018-11-20 20:41:31"
days=$(printf "%s" "$(( ($(date +%s) - $(date -d "$start_date" +%s)) / 86400 ))")
listings=$(wc -l < /var/gopher/listing.gophermap)
calc=$(printf "%s %s" "$listings" "$days" | awk '{ printf "%0.2f", $1 / $2 }')
printf "QEC receiving %s logs per day (%s logs in %s days)\\n" "$calc" "$listings" "$days"

View File

@ -1,32 +0,0 @@
#!/bin/sh
run_user=$(id -u)
if [ "$run_user" -eq 0 ]; then
n="$1"
s="$2"
if [ -n "$n" ]; then
user_exists=$(id -u "${n}" 2> /dev/null)
if [ -n "${user_exists}" ]; then
if [ -n "${s}" ]; then
path="/var/gopher/${s}"
if [ -d "$path" ]; then
printf "Removing ship '%s' for user '%s'\\n" "${s}" "${n}"
rm -rf "$path"
rm -rf "/var/gopher/ships/${s}"
rm "/home/${n}/ships/${s}"
else
printf "No ship by that name exists.\\n"
fi
else
printf "Specify a ship or colony name.\\n"
fi
else
printf "User not found.\\n"
fi
else
printf "Specify a user.\\n"
fi
else
exec sudo "$0" "$@"
fi

55
bin/rss
View File

@ -1,55 +0,0 @@
#!/bin/sh
run_user=$(id -u)
if [ "$run_user" -eq 0 ]; then
gopher_rss="/var/gopher/rss.xml"
######################################################################
########################## GOPHER VERSION ###########################
######################################################################
# Add header info to xml output
{
printf '<?xml version="1.0"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel>'
printf '<atom:link href="gopher://cosmic.voyage/0/rss.xml" rel="self" type="application/rss+xml" />'
printf "\\n<title>Cosmic Voyage</title>\\n"
printf "<link>gopher://cosmic.voyage</link>\\n"
printf "<description>Messages from the human stellar diaspora</description>\\n"
} > "${gopher_rss}"
xml_escape_script='s/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g; s/"/\&quot;/g; s/'"'"'/\&#39;/g'
# Loop through listings gophermap
loop=0
while read -r line; do
loop=$((loop+1))
if [ "$loop" -lt 20 ]; then
log=$(printf "%s" "$line" | awk -F'\t' '{print $2}')
title=$(printf "%s" "$line" | awk -F'\t' '{print $1}' | sed -e 's|^.||' -e "$xml_escape_script")
owner=$(stat -c %U "/var/gopher${log}")
# print item entry for each log
{
printf "<item>\\n"
printf " <title>%s</title>\\n" "$title"
printf " <author>%s@cosmic.voyage (%s)</author>\\n" "$owner" "$owner"
printf " <link>gopher://cosmic.voyage/0%s</link>\\n" "$(printf "%s" "$log" | sed 's|\ |%20|g')"
printf " <guid>gopher://cosmic.voyage/0%s</guid>\\n" "$(printf "%s" "$log" | sed 's|\ |%20|g')"
printf " <pubDate>%s GMT</pubDate>\\n" "$(date -d "$(stat -c %y "/var/gopher${log}")" +'%a, %d %b %Y %H:%M:%S')"
printf " <description><![CDATA[<pre>\\n"
sed "$xml_escape_script" "/var/gopher${log}"
printf "</pre>]]></description>\\n"
printf "</item>\\n"
} >> "${gopher_rss}"
fi
done < "/var/gopher/listing.gophermap"
# close up the footer
{
printf "</channel>\\n"
printf "</rss>\\n"
} >> "${gopher_rss}"
else
exec sudo "$0" "$@"
fi

View File

@ -1,19 +0,0 @@
#!/bin/bash
finish () {
if [ -f "$temp_scores" ]; then
rm "$temp_scores"
fi
}
trap finish EXIT
temp_scores=$(mktemp -t "$(basename "$0").scores.XXXXXXX") || exit 1
for u in $(voyagers); do
if ls /home/"${u}"/ships/**/*.txt &> /dev/null; then
words=$(wordcount "${u}")
printf "%s,%s\\n" "$u" "$words" >> "$temp_scores"
fi
done
sort -rnt"," -k2 "$temp_scores"

142
bin/ship
View File

@ -1,142 +0,0 @@
#!/bin/sh
YELLOW="$(tput setaf 12)"
GREEN="$(tput setaf 10)"
RED="$(tput setaf 9)"
RESET="$(tput sgr0)"
NAME="$(basename "$0")"
main() {
# who is running this script
run_user=$(id -u)
if [ "$run_user" -eq 0 ]; then
# if running as root, check who sudoed and create ship for that user
user="$SUDO_USER"
# draw introduction
printf "%sINITIALIZING QEC%s .. %sGOOD%s\\n" "$YELLOW" "$RESET" "$GREEN" "$RESET"
printf "Connecting user [%s] .. %sGOOD%s\\n" "${YELLOW}${user}${RESET}" "$GREEN" "$RESET"
printf "Request for new QEC node .. %sGOOD%s\\n" "$GREEN" "$RESET"
printf "\\n"
# prompt for ship name
printf "Name of %s? %s" "$NAME" "$GREEN"
read -r shipname
printf "%s" "$RESET"
# if ship name is valid...
if printf "%s" "$shipname" | LC_ALL=C grep -Eq "^[A-Za-z0-9]+[A-Za-z0-9\\.\\ \\-]+$"; then
path="/var/gopher/${shipname}"
ship_exists=$(find /var/gopher -maxdepth 1 -iname "$shipname")
# if ship does not already exist
if [ -z "$ship_exists" ]; then
# print message about ship name creation
printf "Attaching new node [%s]\\n" "${YELLOW}${shipname}${RESET}"
# create ship directory in gopher and give ownership to user
mkdir "$path"
chmod 755 "$path"
chown -R "$user" "$path"
# create ship listings dir and link to ship gophermap
mkdir "/var/gopher/ships/${shipname}"
ln -s "/var/gopher/ships/ship/gophermap" "/var/gopher/ships/${shipname}/gophermap"
# create a symlink in user's home dir for easy access
mkdir -p "/home/${user}/ships"
ln -s "$path" "/home/${user}/ships/${shipname}"
# notify user by email
sed -e "s/USERNAME/${user}/g" -e "s/SHIPNAME/${shipname}/" /etc/templates/newship.tmpl | sendmail "$user"
# print success message
printf "Node registration .. %sSUCCESS%s\\n" "$GREEN" "$RESET"
# prompt user for LICENSE information
printf "\\n"
printf "Would you like to define a license for your messages? "
if yesno; then
printf ".. %sYES%s.\\n" "${GREEN}" "${RESET}"
printf "Available licenses:\\n"
printf " 0. [%sSuggested%s] CC-BY-SA 4.0 (distribute, remix with attribution, share-alike)\\n" "$YELLOW" "$RESET"
printf " 1. CC BY-NC-ND 4.0 (share with attribution, no commercial, no remix)\\n" "$YELLOW" "$RESET"
printf " 2. CC BY-NC-SA 4.0 (share and remix with attribution, no commercial use)\\n"
printf " 3. All Rights Reserved\\n"
printf " 4. Choose by SPDX Identifier\\n"
printf " 5. Cancel / Decide later\\n"
printf "\\n"
printf " Choice? "
read -r license
case "$license" in
0*)
printf "Selected: %sCC BY-SA 4.0%s\\n" "$GREEN" "$RESET"
cp "/var/cosmic/licenses/CC-BY-SA-4.0" "${path}/LICENSE"
chown "$user" "${path}/LICENSE"
printf "You may change your license by editing the file named LICENSE in your %s directory.\\n" "$NAME"
;;
1*)
printf "Selected: %sCC BY-NC-ND 4.0%s\\n" "$GREEN" "$RESET"
cp "/var/cosmic/licenses/CC-BY-NC-ND-4.0" "${path}/LICENSE"
chown "$user" "${path}/LICENSE"
printf "You may change your license by editing the file named LICENSE in your %s directory.\\n" "$NAME"
;;
2*)
printf "Selected: %sCC BY-NC-SA 4.0%s\\n" "$GREEN" "$RESET"
cp /var/cosmic/licenses/CC-BY-NC-SA-4.0 "${path}/LICENSE"
chown "$user" "${path}/LICENSE"
printf "You may change your license by editing the file named LICENSE in your %s directory.\\n" "$NAME"
;;
3*)
printf "Selected: %sAll Rights Reserved%s\\n" "$GREEN" "$RESET"
printf "You may change your license by creating a file named LICENSE in your %s directory.\\n" "$NAME"
;;
4*)
printf "Selected: %sChoose by SPDX Identifier%s\\n" "$GREEN" "$RESET"
printf "Please enter case-sensitive identifier: "
read -r spdx
prefix="https://raw.githubusercontent.com/spdx/license-list-data/master/text/"
if license=$(curl --silent --fail "${prefix}${spdx}.txt"); then
printf "%s" "$license" > "${path}/LICENSE"
chown "$user" "${path}/LICENSE"
printf "You may change your license by editing the file named LICENSE in your %s directory.\\n" "$NAME"
else
printf "%sFAILED:%s Identifier not found.\\n" "$RED" "$RESET"
printf "You may manually add a license of your choosing by creating a file named LICENSE in your %s directory.\\n" "$NAME"
fi
;;
*)
printf "Selected: %sCancel / Decide later%s\\n" "$GREEN" "$RESET"
printf "You may manually add a license of your choosing by creating a file named LICENSE in your %s directory.\\n" "$NAME"
;;
esac
else
printf ".. %sNO%s.\\n" "${RED}" "${RESET}"
fi
else
owner=$(stat -c %U "$ship_exists")
printf "%sABORT:%s A node by that name exists and is owned by %s\\n" "$RED" "$RESET" "$owner"
exit 1
fi
else
printf "%sABORT:%s ASCII letters, numbers, spaces and dashes only.\\n" "$RED" "$RESET"
exit 1
fi
else
exec sudo "$0"
fi
}
yesno () {
old_stty_cfg=$(stty -g)
stty raw -echo
yn=$(while ! head -c 1 | grep -i '[ny]'; do true; done)
stty "$old_stty_cfg"
case $yn in
y ) result=0 ;;
* ) result=1 ;;
esac
return $result
}
main

View File

@ -1,16 +0,0 @@
#!/bin/sh
run_user=$(id -u)
if [ "$run_user" -eq 0 ] || [ "$run_user" -eq 1000 ]; then
if [ -f "$1" ]; then
for u in $(members users); do
if [ "$u" != "anonhmmst" ]; then
sed -e "s/USERNAME/${u}/g" "$1" | sendmail "$u"
fi
done
else
printf "Filename of email required.\\n"
fi
else
printf "This script really isn't meant for users. You cannot use it.\\n"
fi

View File

@ -1,10 +0,0 @@
#!/bin/sh
# generate tilde.json
run_user=$(id -un)
if [ "$run_user" = "publish" ]; then
userlist=$(voyagers | awk '{print "{\"username\":\"" $0 "\"}," }')
printf '{"name": "cosmic.voyage", "url": "https://cosmic.voyage", "signup_url": "https://cosmic.voyage/join.html", "user_count": %s, "want_users": true, "admin_email": "james@tomasino.org", "description": "Cosmic Voyage is a public-access unix system and tilde community based around a collaborative science-fiction universe. Users write stories as the people aboard ships, colonies, and outposts, using the only remaining free, interconnected network that unites the dispersed peoples of the stars.", "users": [%s]}' "$(grep -E '1[0-9]{3}' "/etc/passwd" | grep -c 'home')" "${userlist%?}" > "/var/gopher/tilde.json"
else
exec sudo -u publish "$0" "$@"
fi

View File

@ -1,2 +0,0 @@
#!/bin/sh
grep -E '1[0-9]{3}' "/etc/passwd" | grep 'home' | awk -F":" '{print $1}'

View File

@ -1,61 +0,0 @@
#!/bin/sh
die () {
msg="$1"
code="$2"
# exit code defaults to 1
if printf "%s" "$code" | grep -q '^[0-9]+$'; then
code=1
fi
# output message to stdout or stderr based on code
if [ -n "$msg" ]; then
if [ "$code" -eq 0 ]; then
printf "%s\\n" "$msg"
else
printf "%s\\n" "$msg" >&2
fi
fi
exit "$code"
}
yesno () {
old_stty_cfg=$(stty -g)
stty raw -echo
yn=$(while ! head -c 1 | grep -i '[ny]'; do true; done)
stty "$old_stty_cfg"
case $yn in
y ) result=0 ;;
* ) result=1 ;;
esac
return $result
}
printf "This script will attempt to fetch and store your fediverse account webfinger\n"
printf "information. Cosmic is set up to serve that to users who search or mention you\n"
printf "at your cosmic.voyage username. If they send a message to %s@cosmic.voyage\n" "${USER}"
printf "it will properly deliver to your real account.\n\n"
printf "This script only needs to be run once to set up your redirect.\n\n"
printf "What is your fedi address? (format @username@server.com) [Enter to cancel]: \n"
read -r fedi
if [ -z "$fedi" ]; then
die "" 2
else
fediuser=$(printf "%s" "$fedi" | awk '{split($0,a,"@"); print a[2]}')
fediserver=$(printf "%s" "$fedi" | awk '{split($0,a,"@"); print a[3]}')
if [ -z "$fediuser" ]; then
die "Improper address" 2
fi
if [ -z "$fediserver" ]; then
die "Improper address" 2
fi
echo "$fediserver" "$fediuser"
fediwebfinger="$(curl -s "https://${fediserver}/.well-known/webfinger?resource=acct:${fediuser}@${fediserver}")"
printf "Found the following:\n\n%s\n" "$fediwebfinger"
printf "\nDo you want to save it?\n"
if yesno; then
printf "%s" "$fediwebfinger" > "$HOME/.webfinger.json"
printf "SAVED!\n"
else
printf "ABORT!\n"
fi
fi

View File

@ -1,75 +0,0 @@
#!/bin/bash
# Output a sorted list of currently logged-in users, tfurrows@sdf.org
# Completely and utterly free, do whatever you want with this.
#defaults
c0="\e[0m" # color reset
c1="\e[32m" # title and total color
c2="\e[36m" # color of [letter]
c3="\e[33m" # color of user count per letter
c4="\e[35m" # color of known users (from ~/.whoiknow)
# Process arguments
while getopts "hc" opt; do
case $opt in
h)
printf "Usage: whoa [-ch]\n"
printf " -c removes all color, -h shows this message. \n"
printf " Place a text file named .whoiknow in your root, one login name per line, to highlight known users in the output.\n"
exit
;;
c)
# color off
c0=""
c1=""
c2=""
c3=""
c4="*"
;;
\?)
printf "Usage: whoa [-ch]\n"
printf " -c removes all color, -h shows this message. \n"
printf " Place a text file named .whoiknow in your root, one login name per line, to hi
ghlight known users in the output.\n"
exit;
;;
esac
done
# check for .whoiknow text file, read known usernames into array
declare knownUsers
if [ -f ~/.whoiknow ]; then
mapfile -t knownUsers < ~/.whoiknow
fi
# Get and sort user list
USERS="$(/usr/bin/who -q | sed -e '$d')"
array=(${USERS// / })
readarray -t sorted < <(for a in "${array[@]}"; do echo "$a"; done | sort -u)
# store in associative array
declare -A alphaUsers
for i in "${!sorted[@]}"
do
if [[ " ${knownUsers[@]} " =~ " ${sorted[i]} " ]]; then
alphaUsers["${sorted[i]:0:1}"]+="${c4}"${sorted[i]}"${c0}, "
else
alphaUsers["${sorted[i]:0:1}"]+=${sorted[i]}", "
fi
done
printf "\n ${c1}Alphabetical User List (logged in)${c0}\n"
for x in {a..z}
do
if [[ ! -z ${alphaUsers[$x]} ]]; then
countTemp="${alphaUsers[$x]//[^ ]}"
total="$(($total+${#countTemp}))"
countTemp=$(printf "%03d" ${#countTemp})
printf "\n [${c2}${x^}${c0}] [${c3}$countTemp${c0}] "
printf "${alphaUsers[$x]::-2}" #strip the last comma/space off
fi
done
printf "\n\n ${c1}$total users total${c0}"
printf "\n\n"

View File

@ -1,2 +0,0 @@
#!/bin/sh
/usr/bin/lynx -display_charset=utf8 --lss=/dev/null /var/wiki/index.html

View File

@ -1,4 +0,0 @@
#!/bin/sh
chgrp -R users /var/wiki/
find /var/wiki/* -type f -exec chmod 664 {} \;
find /var/wiki/* -type d -exec chmod 775 {} \;

View File

@ -1,6 +0,0 @@
#!/bin/sh
if [ -d "/home/${1:-$USER}/ships/" ]; then
wc -w /home/"${1:-$USER}"/ships/**/*.txt | tail -n 1 | awk '{print $1}'
else
printf "0\\n"
fi

2
completion/log.d → completion/cosmic-log.d Executable file → Normal file
View File

@ -5,7 +5,7 @@ _log() {
cur=${COMP_WORDS[COMP_CWORD]}
local helplist
helplist=$(log -z)
mapfile -t COMPREPLY < <( compgen -W "$helplist" -- "$cur" )
COMPREPLY=( $( compgen -W "$helplist" -- "$cur" ) )
}
# Detect if current shell is ZSH, and if so, load this file in bash

View File

@ -1,14 +0,0 @@
#!/bin/sh
# shellcheck source=log
# shellcheck disable=SC1091
. /etc/efingerd/log
printf "Users currently online:\\n"
w="$(who | cut -f 1 -d ' ' | sort -u)"
printf "%s" "$w" | tr '\n' ' ' | sed 's/^/ /'
printf "\\n\\nWho control these ships:\\n"
s=$(
for line in $w; do
roster "$line" | awk '{$1=""; print $0 }'
done)
printf "%s" "$s" | sort -u | sed 's/^/ /'

View File

@ -1,3 +0,0 @@
#!/bin/sh
printf "%s %s fingered from %s@%s\\n" "$(date)" "$3" "$1" "$2" >> /var/log/efingerd.log

View File

@ -1,53 +0,0 @@
#!/bin/sh
# $1 = identity of remote user fingering you
# $2 = address of remote machine fingering you
# $3 = name of user being fingered (you!)
# shellcheck source=log
# shellcheck disable=SC1091
. /etc/efingerd/log
if [ "$3" = "root" ]; then
printf "QEC STATUS: ERROR\\nROOT ACCESS DENIED.\\n"
else
user_folder="/home/${3}"
# Prints current user's ship roster
printf "Ships registered to user \"%s\"\\n" "$3"
/usr/local/bin/roster "$3" | awk '{$1=" "; print $0}'
# This portion is maintained for compatability with fellowsh
# a tildeverse/pubnix social network built on fingerd
# Project
printf "Project:\\n"
if [ -f "${user_folder}/.project" ]; then
sed 's/^/ /' "${user_folder}/.project"
else
printf "No Project.\\n"
fi
# Plan
printf "Plan:\\n"
if [ -f "${user_folder}/.plan" ]; then
sed 's/^/ /' "${user_folder}/.plan"
else
printf "No Plan.\\n"
fi
# Timezone
if [ -f "${user_folder}/.tz" ]; then
printf "Timezone: %s\\n" "$(cat "${user_folder}/.tz")"
fi
# Timezone
if [ -f "${user_folder}/.pronouns" ]; then
printf "Pronouns: %s\\n" "$(cat "${user_folder}/.pronouns")"
fi
# Online status
if finger "$3" | grep -q 'On since'; then
printf "Online.\\n"
fi
fi

View File

@ -1,50 +0,0 @@
#!/bin/sh
if [ "$3" = "latest" ]; then
echo "The latest messages logged to the QEC:"
/usr/local/bin/latest
exit 0
fi
if [ "$3" = "time" ]; then
echo The time is...
d="$(date -u)"
beatTAI=$(echo "x = ($(date +%s)) % 86400; scale=3; x / 86.4" | bc)
j=$(echo "x = $(date +%s); scale=5; x / 86400 + 2440587.5" | bc)
printf "Gregorian Date : %s\n" "$d"
printf "beatTAI : %s\n" "$beatTAI"
printf "Julian Date : %s\n" "$j"
exit 0
fi
if [ "$3" = "ping" ]; then
echo "PONG!"
ping -c 5 "$2"
exit 0
fi
if [ "$3" = "fortune" ]; then
/usr/games/fortune
exit 0
fi
if [ "$3" = "uptime" ]; then
/usr/bin/uptime
exit 0
fi
if [ "$3" = "changelog" ]; then
head -n 30 /var/wiki/changelog.html | awk '/^ / { print $0 }'
echo " ..."
exit 0
fi
# shellcheck source=log
# shellcheck disable=SC1091
. /etc/efingerd/log
cat <<EOM
QEC STATUS: ERROR
SHIP OR USER NOT DEFINED.
THIS REQUEST HAS BEEN LOGGED.
EOM

View File

@ -1,56 +0,0 @@
Subject: Expanding the universe
Hi ~USERNAME,
Thanks for joining cosmic.voyage and making it such an awesome
place right out of the gate. I've been thrilled waking up each day
to the new stories. We have so much fun chatting about
possibilities in IRC, too. It's an inspiration to write more,
which I really appreciate.
Let's keep this momentum going, okay? Everyone is fairly engaged
so far, but I know that as the shiny paint begins to dull some of
our writers will slip away or visit less often. (That's totally
okay! I can't wait for the surprise visits we'll get from our
infrequent writers in the months ahead.) But while we still have
the energy and plenty of resources let's attract some new people
too.
Our system load is rarely over 0.01, even with the people that sit
in tmux and IRC. This may be a tiny instance, but it doesn't take
much to run text stories. I think we can scale quite a bit before
processing or bandwidth looks problematic.
If you know other people who like to write, invite them along with
us on the journey. While some technical skill is required to use
the system, that should be part of the selling point, not
a detriment. Part of our experience is using these primitive tools
and it's a very simple gateway for new *nix users to get their
feet wet.
Over the holiday I plan on recording some tutorials that will walk
users through all the steps necessary to create an account, add
a ship, send a long message, add a ship description, and so on.
Once they're ready I'll share the links out over email. In the
meantime, I encourage you to help be ambassadors to new people as
you've already been doing.
I've gotten so lucky with the crews that have taken the cosmic
voyage so far. You're all brilliant, creative, and kind. Let's
keep that up and invite more!
In case you joined in the beginning when things were a little more
ad-hoc, here's our current process for becoming a new user:
1. pick a username
2. send me a ssh pubkey
That's it! I'll add the user to the system using that pubkey. Once
they're in, the welcome email should tell them how to do all the
next stuff, like creating a ship and logging messages.
We've got 23 users as of this email. Let's see if we can get that
over 50. :D
Bon voyage,
tomasino

View File

@ -1,69 +0,0 @@
Subject: Federating Email
Hi ~USERNAME,
Our lovely system is introducing some new federation features with
other pubnix servers. If you visit our IRC channel, you may have
already noted that it's on the tildeverse IRC server. This host
acts as one of the servers connecting into that same system.
We have two other basic federation systems being worked on:
1) Email - As of today, this server can send email to any of the
following servers:
- *.circumlunar.space
- grex.org
- rawtext.club
- sdf.org
- tilde.team
- tilde.town
- yourtilde.com
- thunix.net
Any other outbound email is restricted. If you know of other
pubnix's that should be added to the list, please send me
a note and I'll add them. This goes toward the effort of
keeping things story-focused, but playing nice with the
pubnix-verse.
2) Finger - If you read gopher, solderpunk has written up an
in-depth phlog post about his efforts to bring finger back to
life in the pubnix space.
gopher://zaibatsu.circumlunar.space/0/~solderpunk/phlog/were-bringin-finger-back.txt
In short, you can finger users at cosmic.voyage and get some
cool results back. Currently the system will share your .plan
and .project files in your home directory if they exist (normal
finger behavior) and also your ship roster. You can view the
standard finger script on git here:
https://tildegit.org/cosmic/cosmic/src/branch/master/efingerd/luser
You can also:
- finger latest@cosmic.voyage
- finger uptime@cosmic.voyage
- finger ping@cosmic.voyage
- finger time@cosmic.voyage
- finger fortune@cosmic.voyage
Finally, solderpunk's "fellowsh" tool, built on top of finger,
is available on the system. It's still in active development
and I'll be pulling in updates as they're made.
Thanks to the advice of one of our writers, I've also created
a new 'menu' tool that offers an easy-to-use interface for many of
the common scripts on the server. It's also a great way to play
with and discover new things.
Finally, I want to tell you all you're super awesome. We broke 100
posts before the new year. If you finger uptime, you'll see that
we've been running for 42 days as of today. That's more than
2 logs per day!
Keep up the amazing writing, everyone, and keep sharing the
system.
Bon voyage,
tomasino

View File

@ -1,11 +0,0 @@
Subject: New Admin
Hi ~USERNAME,
I wanted to send everyone a quick note to let you know Cosmic
Voyage has an additional admin now: fosslinux
If you need help with anything and can't find me, he's your man.
Cheers,
tomasino

View File

@ -1,9 +0,0 @@
Subject: Anthology #1
Hi again ~USERNAME,
If you would like your story omitted from the 2018 anthology,
please contact khuxkm or tomasino and let us know.
Cheers,
tomasino

View File

@ -1,20 +0,0 @@
Subject: Anthology #1
Hi ~USERNAME,
One of our users, khuxkm, is putting together an anthology ebook
of our stories from 2018. He is inviting all authors who wrote
a story entry in 2018 to submit an introduction letter about
Cosmic Voyage or an introduction to their story. These will be
bundled into the ebook. If this works well, we'll likely generate
a new anthology each year.
If you'd like to participate, please go ahead and email
khuxkm@cosmic.voyage directly.
If you would like to discuss the anthology format or have
suggestions, you can email him or join us in the #cosmic IRC
channel on irc.tilde.chat. (run "chat" from cosmic command line)
Cheers,
tomasino

View File

@ -1,25 +0,0 @@
Subject: System Upgrade
Hey ~USERNAME,
Yesterday I upgraded cosmic.voyage from Ubuntu 19.10 to 20.04. I ran
through all the stuff in our system menu and a few other odds and ends
and it appears that everything is working okay. If you encounter any
issues please let me know.
In other news the Tilde Net News system (run 'news') is now peering with
tilde.club, the first and largest tilde server. They seem pretty active,
so if you want to engage you can try that out. The news program under
the hood is called 'slrn' and you can read more on how to configure it
to your personal tastes here:
http://slrn.sourceforge.net/documentation.html
Our little community is up to 119 voyagers now. How exciting!
If you're still stuck at home and looking for a creative way to escape
the boredom, why not create a new ship or outpost and leave this Earth
far behind? See you out there.
Cheers,
tomasino

View File

@ -1,20 +0,0 @@
Subject: NaNoWriMo
Hey ~USERNAME,
National Novel Writing Month (NaNoWriMo) begins in one week and to celebrate
I'm putting together 30 days of writing encouragement. I'll be sharing these on
tilde net news (use the "news" command and look in tilde.cosmic) as well as on
my gopher hole at gopher://gopher.black. I hope you'll check them out and find
some motivation within to help you tell some awesome stories.
While Cosmic Voyage may not be geared toward novel writing per se I'll be using
this season to put out as many new stories in the 'verse as I can. Will I write
50,000 words in November? Who knows?
What about you? Do you have the story inside that's been dying to come out but
you haven't had the time? Maybe this month will be your opportunity to push it
along. Whether it's here on Cosmic or abroad I hope you find your voice.
Cheers,
tomasino

View File

@ -1,14 +0,0 @@
Subject: System Update
Hey ~USERNAME,
Ubuntu 22.04 has had time to be released and is stable. That means it'll
be time to make a system update to that version soon. I'm tentatively
planning on that taking place next weekend, on or around the 10th of
September. We'll be taking a backup snapshot first, just in case.
Following that weekend there's a risk some things may be broken. Please
let me know if you run into any problems. You can email me from cosmic
directly or on the IRC channel or wherever.
Thanks!
tomasino

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.0 KiB

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/mstile-150x150.png"/>
<TileColor>#00a300</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 797 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -1,19 +0,0 @@
{
"name": "",
"short_name": "",
"icons": [
{
"src": "/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 MiB

View File

@ -1,275 +0,0 @@
/* from http://bbebooksthailand.com/bb-CSS-boilerplate.html */
/* This adds margins around every page to stop ADE's line numbers from being superimposed over content */
@page {
margin: 10px;
}
/*===Reset code to prevent cross-reader strangeness===*/
html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
center,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
embed,
figure,
figcaption,
footer,
header,
hgroup,
menu,
nav,
output,
ruby,
section,
summary,
time,
mark,
audio,
video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
vertical-align: baseline;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
ol,
ul,
li,
dl,
dt,
dd {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
vertical-align: baseline;
}
/*===GENERAL PRESENTATION===*/
/*===Body Presentation and Margins===*/
/* Text alignment is still a matter of debate. Feel free to change to text-align: left; */
body {
text-align: justify;
line-height: 1.2em;
}
/*===Headings===*/
/* After page breaks, eReaders sometimes do not render margins above the content. Adjusting padding-top can help */
h1 {
text-indent: 0;
text-align: left;
margin: 0 0 30px 0;
font-size: 18px;
font-weight: normal;
page-break-before: avoid;
line-height: 1.2em; /*gets squished otherwise on ADE */
border-bottom: 1px solid black;
}
h2 {
text-indent: 0;
text-align: center;
margin: 20px 0 0 0;
font-size: 14px;
font-weight: bold;
page-break-before: avoid;
line-height: 1.2em; /*get squished otherwise on ADE */
}
tr, img {
page-break-inside: avoid;
}
img {
max-width: 100% !important;
}
@page :left {
margin: 15mm 20mm 15mm 10mm;
}
@page :right {
margin: 15mm 10mm 15mm 20mm;
}
/* Hyphen and pagination Fixer */
/* Note: Do not try on the Kindle, it does not recognize the hyphens property */
h1,
h2,
h3,
h4,
h5,
h6 {
-webkit-hyphens: none !important;
hyphens: none;
page-break-after: avoid;
page-break-inside: avoid;
page-break-before: avoid;
}
/*===Paragraph Elements===*/
/* Margins are usually added on the top, left, and right, but not on the bottom to prevent certain eReaders not collapsing white space properly */
p {
margin: 0;
widows: 2;
orphans: 2;
}
/* 1st level TOC */
p.toctext {
margin: 0 0 0 1.5em;
text-indent: 0;
}
/* 2nd level TOC */
p.toctext2 {
margin: 0 0 0 2.5em;
text-indent: 0;
}
h1.main {
text-align: center;
border-bottom: 0;
margin-top: 300px;
margin-bottom: 5px;
font-size: 32px;
font-variant: small-caps;
}
h1.toc-title {
margin-left: 2em;
}
h1.subtitle {
font-style: italic;
font-size: larger;
font-weight: bold;
margin-left: 0;
margin-bottom: 1em;
text-align: center;
border-bottom: 0;
}
.rights {
display: block;
position: absolute;
bottom: 30px;
left: 15px;
}
/*==LISTS==*/
ul {
margin: 1em 0 0 3em;
text-align: left;
}
ol {
margin: 1em 0 0 3em;
text-align: left;
font-size: 14px;
line-height: 1.3em;
}
ol li a {
text-decoration: none;
}
/* This fixes the bug where the text-align property of block-level elements is not recognized on iBooks
example: html markup would look like <p class="centered"><span class="ipadcenterfix">Centered Content</span></p> */
span.ipadcenterfix {
text-align: center;
}
/*==eBook Specific Formatting Below Here==*/
body {
padding: 1em;
font-family: monospace;
}
pre {
font-size: 10px;
line-height: 1.1em;
text-align: left;
white-space: pre;
}
blockquote {
color: #666666;
margin: 1em 0;
padding-left: 1.5em;
border-left: 0.5em #eee solid;
}
p {
margin: 1em 0;
}
.level1 {
}

BIN
files/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,56 +0,0 @@
Something wicked this way comes
%
I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path. Where the fear has gone there will be nothing. Only I will remain.
%
I have never listened to anyone who criticized my taste in space travel, sideshows or gorillas. When this occurs, I pack up my dinosaurs and leave the room.
%
Time is an illusion. Lunchtime doubly so.
%
Would it save you a lot of time if I just gave up and went mad now?
%
Nothing travels faster than the speed of light, with the possible exception of bad news, which obeys its own special laws.
%
You know how sometimes you tell yourself that you have a choice, but really you dont have a choice? Just because there are alternatives doesnt mean they apply to you.
%
We all know interspecies romance is weird.
%
I guess I always felt even if the world came to an end, McDonald's would still be open.
%
The life where nothing was ever unexpected. Or inconvenient. Or unusual. The life without colour, pain or past.
%
The ability to speak does not make you intelligent.
%
You need to read more science fiction. Nobody who reads science fiction comes out with this crap about the end of history
%
If you want to conquer the world, you best have dragons.
%
Look, Dave, I can see youre really upset about this. I honestly think you ought to sit down calmly, take a stress pill, and think things over.
%
You know, Burke, I dont know which species is worse. You dont see them fucking each other over for a goddamn percentage.
%
The way I see it, if youre going to build a time machine into a car, why not do it with some style?
%
Quite an experience to live in fear, isnt it? Thats what it is to be a slave.
%
Mathematics is the only true universal language.
%
Remember, theres no courage without fear.
%
Isnt it strange, to create something that hates you?
%
Miss Everdeen, it is the things we love most that destroy us.
%
All good stories deserve embellishment.
%
Dinosaurs eat man. Woman inherits the earth.
%
Come on, Mr. Frodo. I cant carry it for you, but I can carry you!
%
Remember, no matter where you go, there you are.
%
If it bleeds, we can kill it.
%
We are history, written red, the surface, white our bones on terraformed Mars - cradle of our children
%
Look down. All the way down - the storm abates and the dust settles
%

View File

@ -1,10 +0,0 @@
---
title:
- type: main
text: Cosmic Voyage
- type: subtitle
text: Year One
rights: © 2019 All rights reserved by individual authors
stylesheet: /var/cosmic/files/epub.css
cover-image: /var/cosmic/files/cover.jpg
...

11
files/motd Normal file
View File

@ -0,0 +1,11 @@
Dec 03, 2018:
- 'log -n' helper to create new messages. See 'log -h'
- Fixed log bug that would recursively propmt for messages
- Fixed log bug for files ending in .txt~
Nov 27, 2018:
- 'roster' command alias for 'cosmic-roster', adds optional 'count'
argument to see number of ships. Optional username arg to filter.
Requests or advice? Send a local mail to 'tomasino'.

View File

@ -1,31 +0,0 @@
// I'm sorry you have to see JavaScript on this site, but it's here to
// enable a manual dark mode toggle. When dark mode support improves I
// can probably remove this again.
function setMode(mode, val) {
if (val) document.body.classList.add(mode)
else document.body.classList.remove(mode)
Array.from(document.querySelectorAll('a'))
.filter( el => el.href.indexOf('cosmic.voyage') !== -1)
.map( el => {
var url = el.href
var p = url.indexOf('?') !== -1 ? url.substr(url.indexOf('?')) : ''
var baseURL = url.split('?')[0]
const params = new URLSearchParams(p)
if (val) {
params.append(mode, 1)
} else {
params.delete(mode)
}
p = params.toString()
el.href = baseURL + (p ? '?' + p : '')
})
}
window.addEventListener('DOMContentLoaded', function() {
var params = new URLSearchParams(window.location.search)
if (params.has('dark')) {
setMode('dark', true)
} else if (params.has('light')) {
setMode('light', true)
}
})

View File

@ -1,141 +0,0 @@
@font-face {
font-family: 'inconsolata';
src: url('/inconsolata-regular-webfont.woff2') format('woff2'),
url('/inconsolata-regular-webfont.woff') format('woff');
font-weight: normal;
font-style: normal;
font-display: swap;
}
html {
margin: 0;
padding: 0;
}
body {
color: #333;
background-color: #f2f4f4;
background-repeat: repeat;
}
a,
a:visited,
a:hover,
a:active {
color: rgb(62, 231, 123);
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
.dim {
color: rgb(62, 231, 123, 0.5);
}
.mastodon {
display: none;
}
@media (prefers-color-scheme: dark) {
body {
color: rgb(50, 200, 100);
background-color: #010;
background-image: none;
}
a,
a:visited,
a:hover,
a:active {
color: rgb(62, 231, 123);
}
.dim {
color: rgb(62, 231, 123, 0.5);
}
}
@media (prefers-color-scheme: light) {
body {
color: #333;
background-color: #f2f4f4;
background-repeat: repeat;
}
a,
a:visited,
a:hover,
a:active {
color: #333;
font-weight: bold;
}
.dim {
color: rgba(30, 30, 30, 0.5);
}
}
/* Manually toggled dark class on body */
body.dark {
color: rgb(50, 200, 100);
background-color: #010;
background-image: none;
}
.dark a,
.dark a:visited,
.dark a:hover,
.dark a:active {
color: rgb(62, 231, 123);
}
.dark .dim {
color: rgb(62, 231, 123, 0.5);
}
/* Manually toggled light class on body */
body.light {
color: #333;
background-color: #f2f4f4;
background-repeat: repeat;
}
.light a,
.light a:visited,
.light a:hover,
.light a:active {
color: #333;
font-weight: bold;
}
.light .dim {
color: rgba(30, 30, 30, 0.5);
}
.page-wrapper {
text-align: center;
}
.inner-wrapper {
display: inline-block;
text-align: left;
white-space: pre;
font-family: 'inconsolata', monospace;
margin: 0 auto;
width: auto;
}
ol {
padding: 0;
line-height: 0.5em;
}
@media screen and (min-width: 700px) {
body, html {
font-size: 18px;
}
}
@media screen and (min-width: 900px) {
body, html {
font-size: 24px;
}
}

53
install.sh Executable file
View File

@ -0,0 +1,53 @@
#!/bin/sh
# Get Path to script folder
DIR="$( cd "$( dirname "$0" )" && pwd )"
# Fix path in case of symlinks
DIR=$(cd "$DIR" && pwd -P)
# Admin commands
if [ ! -L "/usr/local/bin/cosmic-user" ]; then
ln -s "${DIR}/bin/cosmic-user" "/usr/local/bin/cosmic-user"
fi
if [ ! -L "/usr/local/bin/cosmic-rss" ]; then
ln -s "${DIR}/bin/cosmic-rss" "/usr/local/bin/cosmic-rss"
fi
if [ ! -L "/usr/local/bin/cosmic-web" ]; then
ln -s "${DIR}/bin/cosmic-web" "/usr/local/bin/cosmic-web"
fi
if [ ! -L "/usr/local/bin/cosmic-ship" ]; then
ln -s "${DIR}/bin/cosmic-ship" "/usr/local/bin/cosmic-ship"
fi
# User runnable commands
if [ ! -L "/usr/local/bin/cosmic-roster" ]; then
ln -s "${DIR}/bin/cosmic-roster" "/usr/local/bin/cosmic-roster"
fi
if [ ! -L "/usr/local/bin/roster" ]; then
ln -s "${DIR}/bin/cosmic-roster" "/usr/local/bin/roster"
fi
if [ ! -L "/usr/local/bin/motd" ]; then
ln -s "${DIR}/bin/cosmic-motd" "/usr/local/bin/motd"
fi
if [ ! -L "/usr/local/bin/log" ]; then
ln -s "${DIR}/bin/cosmic-log" "/usr/local/bin/log"
fi
# Files
if [ ! -L "/etc/welcomemail.tmpl" ]; then
ln -s "${DIR}/templates/welcomemail.tmpl" "/etc/welcomemail.tmpl"
fi
if [ ! -L "/etc/newship.tmpl" ]; then
ln -s "${DIR}/templates/newship.tmpl" "/etc/newship.tmpl"
fi
# Manpages
if [ ! -L "/usr/share/man/man1/log.1" ]; then
ln -s "${DIR}/man/cosmic-log.1" "/usr/share/man/man1/log.1"
fi
# BASH completion
if [ ! -L "/etc/bash_completion.d/log" ]; then
ln -s "${DIR}/completion/cosmic-log.d" "/etc/bash_completion.d/log"
chmod 644 "/etc/bash_completion.d/log"
fi

View File

@ -1,404 +0,0 @@
CC BY-NC-ND 4.0 (share with attribution, no commercial, no remix)
Attribution-NonCommercial-NoDerivatives 4.0 International
=======================================================================
Creative Commons Corporation ("Creative Commons") is not a law firm and
does not provide legal services or legal advice. Distribution of
Creative Commons public licenses does not create a lawyer-client or
other relationship. Creative Commons makes its licenses and related
information available on an "as-is" basis. Creative Commons gives no
warranties regarding its licenses, any material licensed under their
terms and conditions, or any related information. Creative Commons
disclaims all liability for damages resulting from their use to the
fullest extent possible.
Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and
conditions that creators and other rights holders may use to share
original works of authorship and other material subject to copyright
and certain other rights specified in the public license below. The
following considerations are for informational purposes only, are not
exhaustive, and do not form part of our licenses.
Considerations for licensors: Our public licenses are
intended for use by those authorized to give the public
permission to use material in ways otherwise restricted by
copyright and certain other rights. Our licenses are
irrevocable. Licensors should read and understand the terms
and conditions of the license they choose before applying it.
Licensors should also secure all rights necessary before
applying our licenses so that the public can reuse the
material as expected. Licensors should clearly mark any
material not subject to the license. This includes other CC-
licensed material, or material used under an exception or
limitation to copyright. More considerations for licensors:
wiki.creativecommons.org/Considerations_for_licensors
Considerations for the public: By using one of our public
licenses, a licensor grants the public permission to use the
licensed material under specified terms and conditions. If
the licensor's permission is not necessary for any reason--for
example, because of any applicable exception or limitation to
copyright--then that use is not regulated by the license. Our
licenses grant only permissions under copyright and certain
other rights that a licensor has authority to grant. Use of
the licensed material may still be restricted for other
reasons, including because others have copyright or other
rights in the material. A licensor may make special requests,
such as asking that all changes be marked or described.
Although not required by our licenses, you are encouraged to
respect those requests where reasonable. More considerations
for the public:
wiki.creativecommons.org/Considerations_for_licensees
=======================================================================
Creative Commons Attribution-NonCommercial-NoDerivatives 4.0
International Public License
By exercising the Licensed Rights (defined below), You accept and agree
to be bound by the terms and conditions of this Creative Commons
Attribution-NonCommercial-NoDerivatives 4.0 International Public
License ("Public License"). To the extent this Public License may be
interpreted as a contract, You are granted the Licensed Rights in
consideration of Your acceptance of these terms and conditions, and the
Licensor grants You such rights in consideration of benefits the
Licensor receives from making the Licensed Material available under
these terms and conditions.
Section 1 -- Definitions.
a. Adapted Material means material subject to Copyright and Similar
Rights that is derived from or based upon the Licensed Material
and in which the Licensed Material is translated, altered,
arranged, transformed, or otherwise modified in a manner requiring
permission under the Copyright and Similar Rights held by the
Licensor. For purposes of this Public License, where the Licensed
Material is a musical work, performance, or sound recording,
Adapted Material is always produced where the Licensed Material is
synched in timed relation with a moving image.
b. Copyright and Similar Rights means copyright and/or similar rights
closely related to copyright including, without limitation,
performance, broadcast, sound recording, and Sui Generis Database
Rights, without regard to how the rights are labeled or
categorized. For purposes of this Public License, the rights
specified in Section 2(b)(1)-(2) are not Copyright and Similar
Rights.
c. Effective Technological Measures means those measures that, in the
absence of proper authority, may not be circumvented under laws
fulfilling obligations under Article 11 of the WIPO Copyright
Treaty adopted on December 20, 1996, and/or similar international
agreements.
d. Exceptions and Limitations means fair use, fair dealing, and/or
any other exception or limitation to Copyright and Similar Rights
that applies to Your use of the Licensed Material.
e. Licensed Material means the artistic or literary work, database,
or other material to which the Licensor applied this Public
License.
f. Licensed Rights means the rights granted to You subject to the
terms and conditions of this Public License, which are limited to
all Copyright and Similar Rights that apply to Your use of the
Licensed Material and that the Licensor has authority to license.
g. Licensor means the individual(s) or entity(ies) granting rights
under this Public License.
h. NonCommercial means not primarily intended for or directed towards
commercial advantage or monetary compensation. For purposes of
this Public License, the exchange of the Licensed Material for
other material subject to Copyright and Similar Rights by digital
file-sharing or similar means is NonCommercial provided there is
no payment of monetary compensation in connection with the
exchange.
i. Share means to provide material to the public by any means or
process that requires permission under the Licensed Rights, such
as reproduction, public display, public performance, distribution,
dissemination, communication, or importation, and to make material
available to the public including in ways that members of the
public may access the material from a place and at a time
individually chosen by them.
j. Sui Generis Database Rights means rights other than copyright
resulting from Directive 96/9/EC of the European Parliament and of
the Council of 11 March 1996 on the legal protection of databases,
as amended and/or succeeded, as well as other essentially
equivalent rights anywhere in the world.
k. You means the individual or entity exercising the Licensed Rights
under this Public License. Your has a corresponding meaning.
Section 2 -- Scope.
a. License grant.
1. Subject to the terms and conditions of this Public License,
the Licensor hereby grants You a worldwide, royalty-free,
non-sublicensable, non-exclusive, irrevocable license to
exercise the Licensed Rights in the Licensed Material to:
a. reproduce and Share the Licensed Material, in whole or
in part, for NonCommercial purposes only; and
b. produce and reproduce, but not Share, Adapted Material
for NonCommercial purposes only.
2. Exceptions and Limitations. For the avoidance of doubt, where
Exceptions and Limitations apply to Your use, this Public
License does not apply, and You do not need to comply with
its terms and conditions.
3. Term. The term of this Public License is specified in Section
6(a).
4. Media and formats; technical modifications allowed. The
Licensor authorizes You to exercise the Licensed Rights in
all media and formats whether now known or hereafter created,
and to make technical modifications necessary to do so. The
Licensor waives and/or agrees not to assert any right or
authority to forbid You from making technical modifications
necessary to exercise the Licensed Rights, including
technical modifications necessary to circumvent Effective
Technological Measures. For purposes of this Public License,
simply making modifications authorized by this Section 2(a)
(4) never produces Adapted Material.
5. Downstream recipients.
a. Offer from the Licensor -- Licensed Material. Every
recipient of the Licensed Material automatically
receives an offer from the Licensor to exercise the
Licensed Rights under the terms and conditions of this
Public License.
b. No downstream restrictions. You may not offer or impose
any additional or different terms or conditions on, or
apply any Effective Technological Measures to, the
Licensed Material if doing so restricts exercise of the
Licensed Rights by any recipient of the Licensed
Material.
6. No endorsement. Nothing in this Public License constitutes or
may be construed as permission to assert or imply that You
are, or that Your use of the Licensed Material is, connected
with, or sponsored, endorsed, or granted official status by,
the Licensor or others designated to receive attribution as
provided in Section 3(a)(1)(A)(i).
b. Other rights.
1. Moral rights, such as the right of integrity, are not
licensed under this Public License, nor are publicity,
privacy, and/or other similar personality rights; however, to
the extent possible, the Licensor waives and/or agrees not to
assert any such rights held by the Licensor to the limited
extent necessary to allow You to exercise the Licensed
Rights, but not otherwise.
2. Patent and trademark rights are not licensed under this
Public License.
3. To the extent possible, the Licensor waives any right to
collect royalties from You for the exercise of the Licensed
Rights, whether directly or through a collecting society
under any voluntary or waivable statutory or compulsory
licensing scheme. In all other cases the Licensor expressly
reserves any right to collect such royalties, including when
the Licensed Material is used other than for NonCommercial
purposes.
Section 3 -- License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the
following conditions.
a. Attribution.
1. If You Share the Licensed Material, You must:
a. retain the following if it is supplied by the Licensor
with the Licensed Material:
i. identification of the creator(s) of the Licensed
Material and any others designated to receive
attribution, in any reasonable manner requested by
the Licensor (including by pseudonym if
designated);
ii. a copyright notice;
iii. a notice that refers to this Public License;
iv. a notice that refers to the disclaimer of
warranties;
v. a URI or hyperlink to the Licensed Material to the
extent reasonably practicable;
b. indicate if You modified the Licensed Material and
retain an indication of any previous modifications; and
c. indicate the Licensed Material is licensed under this
Public License, and include the text of, or the URI or
hyperlink to, this Public License.
For the avoidance of doubt, You do not have permission under
this Public License to Share Adapted Material.
2. You may satisfy the conditions in Section 3(a)(1) in any
reasonable manner based on the medium, means, and context in
which You Share the Licensed Material. For example, it may be
reasonable to satisfy the conditions by providing a URI or
hyperlink to a resource that includes the required
information.
3. If requested by the Licensor, You must remove any of the
information required by Section 3(a)(1)(A) to the extent
reasonably practicable.
Section 4 -- Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that
apply to Your use of the Licensed Material:
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
to extract, reuse, reproduce, and Share all or a substantial
portion of the contents of the database for NonCommercial purposes
only and provided You do not Share Adapted Material;
b. if You include all or a substantial portion of the database
contents in a database in which You have Sui Generis Database
Rights, then the database in which You have Sui Generis Database
Rights (but not its individual contents) is Adapted Material; and
c. You must comply with the conditions in Section 3(a) if You Share
all or a substantial portion of the contents of the database.
For the avoidance of doubt, this Section 4 supplements and does not
replace Your obligations under this Public License where the Licensed
Rights include other Copyright and Similar Rights.
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
c. The disclaimer of warranties and limitation of liability provided
above shall be interpreted in a manner that, to the extent
possible, most closely approximates an absolute disclaimer and
waiver of all liability.
Section 6 -- Term and Termination.
a. This Public License applies for the term of the Copyright and
Similar Rights licensed here. However, if You fail to comply with
this Public License, then Your rights under this Public License
terminate automatically.
b. Where Your right to use the Licensed Material has terminated under
Section 6(a), it reinstates:
1. automatically as of the date the violation is cured, provided
it is cured within 30 days of Your discovery of the
violation; or
2. upon express reinstatement by the Licensor.
For the avoidance of doubt, this Section 6(b) does not affect any
right the Licensor may have to seek remedies for Your violations
of this Public License.
c. For the avoidance of doubt, the Licensor may also offer the
Licensed Material under separate terms or conditions or stop
distributing the Licensed Material at any time; however, doing so
will not terminate this Public License.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
License.
Section 7 -- Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different
terms or conditions communicated by You unless expressly agreed.
b. Any arrangements, understandings, or agreements regarding the
Licensed Material not stated herein are separate from and
independent of the terms and conditions of this Public License.
Section 8 -- Interpretation.
a. For the avoidance of doubt, this Public License does not, and
shall not be interpreted to, reduce, limit, restrict, or impose
conditions on any use of the Licensed Material that could lawfully
be made without permission under this Public License.
b. To the extent possible, if any provision of this Public License is
deemed unenforceable, it shall be automatically reformed to the
minimum extent necessary to make it enforceable. If the provision
cannot be reformed, it shall be severed from this Public License
without affecting the enforceability of the remaining terms and
conditions.
c. No term or condition of this Public License will be waived and no
failure to comply consented to unless expressly agreed to by the
Licensor.
d. Nothing in this Public License constitutes or may be interpreted
as a limitation upon, or waiver of, any privileges and immunities
that apply to the Licensor or You, including from the legal
processes of any jurisdiction or authority.
=======================================================================
Creative Commons is not a party to its public
licenses. Notwithstanding, Creative Commons may elect to apply one of
its public licenses to material it publishes and in those instances
will be considered the “Licensor.” The text of the Creative Commons
public licenses is dedicated to the public domain under the CC0 Public
Domain Dedication. Except for the limited purpose of indicating that
material is shared under a Creative Commons public license or as
otherwise permitted by the Creative Commons policies published at
creativecommons.org/policies, Creative Commons does not authorize the
use of the trademark "Creative Commons" or any other trademark or logo
of Creative Commons without its prior written consent including,
without limitation, in connection with any unauthorized modifications
to any of its public licenses or any other arrangements,
understandings, or agreements concerning use of licensed material. For
the avoidance of doubt, this paragraph does not form part of the
public licenses.
Creative Commons may be contacted at creativecommons.org.

View File

@ -1,444 +0,0 @@
CC BY-NC-SA 4.0 (share and remix with attribution, no commercial use)
This work is licensed under the Creative Commons
Attribution-NonCommercial-ShareAlike 4.0 International License. To
view a copy of this license, visit
http://creativecommons.org/licenses/by-nc-sa/4.0/, or read below.
Attribution-NonCommercial-ShareAlike 4.0 International
=======================================================================
Creative Commons Corporation ("Creative Commons") is not a law firm and
does not provide legal services or legal advice. Distribution of
Creative Commons public licenses does not create a lawyer-client or
other relationship. Creative Commons makes its licenses and related
information available on an "as-is" basis. Creative Commons gives no
warranties regarding its licenses, any material licensed under their
terms and conditions, or any related information. Creative Commons
disclaims all liability for damages resulting from their use to the
fullest extent possible.
Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and
conditions that creators and other rights holders may use to share
original works of authorship and other material subject to copyright
and certain other rights specified in the public license below. The
following considerations are for informational purposes only, are not
exhaustive, and do not form part of our licenses.
Considerations for licensors: Our public licenses are
intended for use by those authorized to give the public
permission to use material in ways otherwise restricted by
copyright and certain other rights. Our licenses are
irrevocable. Licensors should read and understand the terms
and conditions of the license they choose before applying it.
Licensors should also secure all rights necessary before
applying our licenses so that the public can reuse the
material as expected. Licensors should clearly mark any
material not subject to the license. This includes other CC-
licensed material, or material used under an exception or
limitation to copyright. More considerations for licensors:
wiki.creativecommons.org/Considerations_for_licensors
Considerations for the public: By using one of our public
licenses, a licensor grants the public permission to use the
licensed material under specified terms and conditions. If
the licensor's permission is not necessary for any reason--for
example, because of any applicable exception or limitation to
copyright--then that use is not regulated by the license. Our
licenses grant only permissions under copyright and certain
other rights that a licensor has authority to grant. Use of
the licensed material may still be restricted for other
reasons, including because others have copyright or other
rights in the material. A licensor may make special requests,
such as asking that all changes be marked or described.
Although not required by our licenses, you are encouraged to
respect those requests where reasonable. More considerations
for the public:
wiki.creativecommons.org/Considerations_for_licensees
=======================================================================
Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International
Public License
By exercising the Licensed Rights (defined below), You accept and agree
to be bound by the terms and conditions of this Creative Commons
Attribution-NonCommercial-ShareAlike 4.0 International Public License
("Public License"). To the extent this Public License may be
interpreted as a contract, You are granted the Licensed Rights in
consideration of Your acceptance of these terms and conditions, and the
Licensor grants You such rights in consideration of benefits the
Licensor receives from making the Licensed Material available under
these terms and conditions.
Section 1 -- Definitions.
a. Adapted Material means material subject to Copyright and Similar
Rights that is derived from or based upon the Licensed Material
and in which the Licensed Material is translated, altered,
arranged, transformed, or otherwise modified in a manner requiring
permission under the Copyright and Similar Rights held by the
Licensor. For purposes of this Public License, where the Licensed
Material is a musical work, performance, or sound recording,
Adapted Material is always produced where the Licensed Material is
synched in timed relation with a moving image.
b. Adapter's License means the license You apply to Your Copyright
and Similar Rights in Your contributions to Adapted Material in
accordance with the terms and conditions of this Public License.
c. BY-NC-SA Compatible License means a license listed at
creativecommons.org/compatiblelicenses, approved by Creative
Commons as essentially the equivalent of this Public License.
d. Copyright and Similar Rights means copyright and/or similar rights
closely related to copyright including, without limitation,
performance, broadcast, sound recording, and Sui Generis Database
Rights, without regard to how the rights are labeled or
categorized. For purposes of this Public License, the rights
specified in Section 2(b)(1)-(2) are not Copyright and Similar
Rights.
e. Effective Technological Measures means those measures that, in the
absence of proper authority, may not be circumvented under laws
fulfilling obligations under Article 11 of the WIPO Copyright
Treaty adopted on December 20, 1996, and/or similar international
agreements.
f. Exceptions and Limitations means fair use, fair dealing, and/or
any other exception or limitation to Copyright and Similar Rights
that applies to Your use of the Licensed Material.
g. License Elements means the license attributes listed in the name
of a Creative Commons Public License. The License Elements of this
Public License are Attribution, NonCommercial, and ShareAlike.
h. Licensed Material means the artistic or literary work, database,
or other material to which the Licensor applied this Public
License.
i. Licensed Rights means the rights granted to You subject to the
terms and conditions of this Public License, which are limited to
all Copyright and Similar Rights that apply to Your use of the
Licensed Material and that the Licensor has authority to license.
j. Licensor means the individual(s) or entity(ies) granting rights
under this Public License.
k. NonCommercial means not primarily intended for or directed towards
commercial advantage or monetary compensation. For purposes of
this Public License, the exchange of the Licensed Material for
other material subject to Copyright and Similar Rights by digital
file-sharing or similar means is NonCommercial provided there is
no payment of monetary compensation in connection with the
exchange.
l. Share means to provide material to the public by any means or
process that requires permission under the Licensed Rights, such
as reproduction, public display, public performance, distribution,
dissemination, communication, or importation, and to make material
available to the public including in ways that members of the
public may access the material from a place and at a time
individually chosen by them.
m. Sui Generis Database Rights means rights other than copyright
resulting from Directive 96/9/EC of the European Parliament and of
the Council of 11 March 1996 on the legal protection of databases,
as amended and/or succeeded, as well as other essentially
equivalent rights anywhere in the world.
n. You means the individual or entity exercising the Licensed Rights
under this Public License. Your has a corresponding meaning.
Section 2 -- Scope.
a. License grant.
1. Subject to the terms and conditions of this Public License,
the Licensor hereby grants You a worldwide, royalty-free,
non-sublicensable, non-exclusive, irrevocable license to
exercise the Licensed Rights in the Licensed Material to:
a. reproduce and Share the Licensed Material, in whole or
in part, for NonCommercial purposes only; and
b. produce, reproduce, and Share Adapted Material for
NonCommercial purposes only.
2. Exceptions and Limitations. For the avoidance of doubt, where
Exceptions and Limitations apply to Your use, this Public
License does not apply, and You do not need to comply with
its terms and conditions.
3. Term. The term of this Public License is specified in Section
6(a).
4. Media and formats; technical modifications allowed. The
Licensor authorizes You to exercise the Licensed Rights in
all media and formats whether now known or hereafter created,
and to make technical modifications necessary to do so. The
Licensor waives and/or agrees not to assert any right or
authority to forbid You from making technical modifications
necessary to exercise the Licensed Rights, including
technical modifications necessary to circumvent Effective
Technological Measures. For purposes of this Public License,
simply making modifications authorized by this Section 2(a)
(4) never produces Adapted Material.
5. Downstream recipients.
a. Offer from the Licensor -- Licensed Material. Every
recipient of the Licensed Material automatically
receives an offer from the Licensor to exercise the
Licensed Rights under the terms and conditions of this
Public License.
b. Additional offer from the Licensor -- Adapted Material.
Every recipient of Adapted Material from You
automatically receives an offer from the Licensor to
exercise the Licensed Rights in the Adapted Material
under the conditions of the Adapter's License You apply.
c. No downstream restrictions. You may not offer or impose
any additional or different terms or conditions on, or
apply any Effective Technological Measures to, the
Licensed Material if doing so restricts exercise of the
Licensed Rights by any recipient of the Licensed
Material.
6. No endorsement. Nothing in this Public License constitutes or
may be construed as permission to assert or imply that You
are, or that Your use of the Licensed Material is, connected
with, or sponsored, endorsed, or granted official status by,
the Licensor or others designated to receive attribution as
provided in Section 3(a)(1)(A)(i).
b. Other rights.
1. Moral rights, such as the right of integrity, are not
licensed under this Public License, nor are publicity,
privacy, and/or other similar personality rights; however, to
the extent possible, the Licensor waives and/or agrees not to
assert any such rights held by the Licensor to the limited
extent necessary to allow You to exercise the Licensed
Rights, but not otherwise.
2. Patent and trademark rights are not licensed under this
Public License.
3. To the extent possible, the Licensor waives any right to
collect royalties from You for the exercise of the Licensed
Rights, whether directly or through a collecting society
under any voluntary or waivable statutory or compulsory
licensing scheme. In all other cases the Licensor expressly
reserves any right to collect such royalties, including when
the Licensed Material is used other than for NonCommercial
purposes.
Section 3 -- License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the
following conditions.
a. Attribution.
1. If You Share the Licensed Material (including in modified
form), You must:
a. retain the following if it is supplied by the Licensor
with the Licensed Material:
i. identification of the creator(s) of the Licensed
Material and any others designated to receive
attribution, in any reasonable manner requested by
the Licensor (including by pseudonym if
designated);
ii. a copyright notice;
iii. a notice that refers to this Public License;
iv. a notice that refers to the disclaimer of
warranties;
v. a URI or hyperlink to the Licensed Material to the
extent reasonably practicable;
b. indicate if You modified the Licensed Material and
retain an indication of any previous modifications; and
c. indicate the Licensed Material is licensed under this
Public License, and include the text of, or the URI or
hyperlink to, this Public License.
2. You may satisfy the conditions in Section 3(a)(1) in any
reasonable manner based on the medium, means, and context in
which You Share the Licensed Material. For example, it may be
reasonable to satisfy the conditions by providing a URI or
hyperlink to a resource that includes the required
information.
3. If requested by the Licensor, You must remove any of the
information required by Section 3(a)(1)(A) to the extent
reasonably practicable.
b. ShareAlike.
In addition to the conditions in Section 3(a), if You Share
Adapted Material You produce, the following conditions also apply.
1. The Adapter's License You apply must be a Creative Commons
license with the same License Elements, this version or
later, or a BY-NC-SA Compatible License.
2. You must include the text of, or the URI or hyperlink to, the
Adapter's License You apply. You may satisfy this condition
in any reasonable manner based on the medium, means, and
context in which You Share Adapted Material.
3. You may not offer or impose any additional or different terms
or conditions on, or apply any Effective Technological
Measures to, Adapted Material that restrict exercise of the
rights granted under the Adapter's License You apply.
Section 4 -- Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that
apply to Your use of the Licensed Material:
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
to extract, reuse, reproduce, and Share all or a substantial
portion of the contents of the database for NonCommercial purposes
only;
b. if You include all or a substantial portion of the database
contents in a database in which You have Sui Generis Database
Rights, then the database in which You have Sui Generis Database
Rights (but not its individual contents) is Adapted Material,
including for purposes of Section 3(b); and
c. You must comply with the conditions in Section 3(a) if You Share
all or a substantial portion of the contents of the database.
For the avoidance of doubt, this Section 4 supplements and does not
replace Your obligations under this Public License where the Licensed
Rights include other Copyright and Similar Rights.
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
c. The disclaimer of warranties and limitation of liability provided
above shall be interpreted in a manner that, to the extent
possible, most closely approximates an absolute disclaimer and
waiver of all liability.
Section 6 -- Term and Termination.
a. This Public License applies for the term of the Copyright and
Similar Rights licensed here. However, if You fail to comply with
this Public License, then Your rights under this Public License
terminate automatically.
b. Where Your right to use the Licensed Material has terminated under
Section 6(a), it reinstates:
1. automatically as of the date the violation is cured, provided
it is cured within 30 days of Your discovery of the
violation; or
2. upon express reinstatement by the Licensor.
For the avoidance of doubt, this Section 6(b) does not affect any
right the Licensor may have to seek remedies for Your violations
of this Public License.
c. For the avoidance of doubt, the Licensor may also offer the
Licensed Material under separate terms or conditions or stop
distributing the Licensed Material at any time; however, doing so
will not terminate this Public License.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
License.
Section 7 -- Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different
terms or conditions communicated by You unless expressly agreed.
b. Any arrangements, understandings, or agreements regarding the
Licensed Material not stated herein are separate from and
independent of the terms and conditions of this Public License.
Section 8 -- Interpretation.
a. For the avoidance of doubt, this Public License does not, and
shall not be interpreted to, reduce, limit, restrict, or impose
conditions on any use of the Licensed Material that could lawfully
be made without permission under this Public License.
b. To the extent possible, if any provision of this Public License is
deemed unenforceable, it shall be automatically reformed to the
minimum extent necessary to make it enforceable. If the provision
cannot be reformed, it shall be severed from this Public License
without affecting the enforceability of the remaining terms and
conditions.
c. No term or condition of this Public License will be waived and no
failure to comply consented to unless expressly agreed to by the
Licensor.
d. Nothing in this Public License constitutes or may be interpreted
as a limitation upon, or waiver of, any privileges and immunities
that apply to the Licensor or You, including from the legal
processes of any jurisdiction or authority.
=======================================================================
Creative Commons is not a party to its public
licenses. Notwithstanding, Creative Commons may elect to apply one of
its public licenses to material it publishes and in those instances
will be considered the “Licensor.” The text of the Creative Commons
public licenses is dedicated to the public domain under the CC0 Public
Domain Dedication. Except for the limited purpose of indicating that
material is shared under a Creative Commons public license or as
otherwise permitted by the Creative Commons policies published at
creativecommons.org/policies, Creative Commons does not authorize the
use of the trademark "Creative Commons" or any other trademark or logo
of Creative Commons without its prior written consent including,
without limitation, in connection with any unauthorized modifications
to any of its public licenses or any other arrangements,
understandings, or agreements concerning use of licensed material. For
the avoidance of doubt, this paragraph does not form part of the
public licenses.
Creative Commons may be contacted at creativecommons.org.

View File

@ -1,429 +0,0 @@
CC-BY-SA-4.0 (distribute, remix with attribution, share-alike)
Attribution-ShareAlike 4.0 International
=======================================================================
Creative Commons Corporation ("Creative Commons") is not a law firm and
does not provide legal services or legal advice. Distribution of
Creative Commons public licenses does not create a lawyer-client or
other relationship. Creative Commons makes its licenses and related
information available on an "as-is" basis. Creative Commons gives no
warranties regarding its licenses, any material licensed under their
terms and conditions, or any related information. Creative Commons
disclaims all liability for damages resulting from their use to the
fullest extent possible.
Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and
conditions that creators and other rights holders may use to share
original works of authorship and other material subject to copyright
and certain other rights specified in the public license below. The
following considerations are for informational purposes only, are not
exhaustive, and do not form part of our licenses.
Considerations for licensors: Our public licenses are
intended for use by those authorized to give the public
permission to use material in ways otherwise restricted by
copyright and certain other rights. Our licenses are
irrevocable. Licensors should read and understand the terms
and conditions of the license they choose before applying it.
Licensors should also secure all rights necessary before
applying our licenses so that the public can reuse the
material as expected. Licensors should clearly mark any
material not subject to the license. This includes other CC-
licensed material, or material used under an exception or
limitation to copyright. More considerations for licensors:
wiki.creativecommons.org/Considerations_for_licensors
Considerations for the public: By using one of our public
licenses, a licensor grants the public permission to use the
licensed material under specified terms and conditions. If
the licensor's permission is not necessary for any reason--for
example, because of any applicable exception or limitation to
copyright--then that use is not regulated by the license. Our
licenses grant only permissions under copyright and certain
other rights that a licensor has authority to grant. Use of
the licensed material may still be restricted for other
reasons, including because others have copyright or other
rights in the material. A licensor may make special requests,
such as asking that all changes be marked or described.
Although not required by our licenses, you are encouraged to
respect those requests where reasonable. More considerations
for the public:
wiki.creativecommons.org/Considerations_for_licensees
=======================================================================
Creative Commons Attribution-ShareAlike 4.0 International Public
License
By exercising the Licensed Rights (defined below), You accept and agree
to be bound by the terms and conditions of this Creative Commons
Attribution-ShareAlike 4.0 International Public License ("Public
License"). To the extent this Public License may be interpreted as a
contract, You are granted the Licensed Rights in consideration of Your
acceptance of these terms and conditions, and the Licensor grants You
such rights in consideration of benefits the Licensor receives from
making the Licensed Material available under these terms and
conditions.
Section 1 -- Definitions.
a. Adapted Material means material subject to Copyright and Similar
Rights that is derived from or based upon the Licensed Material
and in which the Licensed Material is translated, altered,
arranged, transformed, or otherwise modified in a manner requiring
permission under the Copyright and Similar Rights held by the
Licensor. For purposes of this Public License, where the Licensed
Material is a musical work, performance, or sound recording,
Adapted Material is always produced where the Licensed Material is
synched in timed relation with a moving image.
b. Adapter's License means the license You apply to Your Copyright
and Similar Rights in Your contributions to Adapted Material in
accordance with the terms and conditions of this Public License.
c. BY-SA Compatible License means a license listed at
creativecommons.org/compatiblelicenses, approved by Creative
Commons as essentially the equivalent of this Public License.
d. Copyright and Similar Rights means copyright and/or similar rights
closely related to copyright including, without limitation,
performance, broadcast, sound recording, and Sui Generis Database
Rights, without regard to how the rights are labeled or
categorized. For purposes of this Public License, the rights
specified in Section 2(b)(1)-(2) are not Copyright and Similar
Rights.
e. Effective Technological Measures means those measures that, in the
absence of proper authority, may not be circumvented under laws
fulfilling obligations under Article 11 of the WIPO Copyright
Treaty adopted on December 20, 1996, and/or similar international
agreements.
f. Exceptions and Limitations means fair use, fair dealing, and/or
any other exception or limitation to Copyright and Similar Rights
that applies to Your use of the Licensed Material.
g. License Elements means the license attributes listed in the name
of a Creative Commons Public License. The License Elements of this
Public License are Attribution and ShareAlike.
h. Licensed Material means the artistic or literary work, database,
or other material to which the Licensor applied this Public
License.
i. Licensed Rights means the rights granted to You subject to the
terms and conditions of this Public License, which are limited to
all Copyright and Similar Rights that apply to Your use of the
Licensed Material and that the Licensor has authority to license.
j. Licensor means the individual(s) or entity(ies) granting rights
under this Public License.
k. Share means to provide material to the public by any means or
process that requires permission under the Licensed Rights, such
as reproduction, public display, public performance, distribution,
dissemination, communication, or importation, and to make material
available to the public including in ways that members of the
public may access the material from a place and at a time
individually chosen by them.
l. Sui Generis Database Rights means rights other than copyright
resulting from Directive 96/9/EC of the European Parliament and of
the Council of 11 March 1996 on the legal protection of databases,
as amended and/or succeeded, as well as other essentially
equivalent rights anywhere in the world.
m. You means the individual or entity exercising the Licensed Rights
under this Public License. Your has a corresponding meaning.
Section 2 -- Scope.
a. License grant.
1. Subject to the terms and conditions of this Public License,
the Licensor hereby grants You a worldwide, royalty-free,
non-sublicensable, non-exclusive, irrevocable license to
exercise the Licensed Rights in the Licensed Material to:
a. reproduce and Share the Licensed Material, in whole or
in part; and
b. produce, reproduce, and Share Adapted Material.
2. Exceptions and Limitations. For the avoidance of doubt, where
Exceptions and Limitations apply to Your use, this Public
License does not apply, and You do not need to comply with
its terms and conditions.
3. Term. The term of this Public License is specified in Section
6(a).
4. Media and formats; technical modifications allowed. The
Licensor authorizes You to exercise the Licensed Rights in
all media and formats whether now known or hereafter created,
and to make technical modifications necessary to do so. The
Licensor waives and/or agrees not to assert any right or
authority to forbid You from making technical modifications
necessary to exercise the Licensed Rights, including
technical modifications necessary to circumvent Effective
Technological Measures. For purposes of this Public License,
simply making modifications authorized by this Section 2(a)
(4) never produces Adapted Material.
5. Downstream recipients.
a. Offer from the Licensor -- Licensed Material. Every
recipient of the Licensed Material automatically
receives an offer from the Licensor to exercise the
Licensed Rights under the terms and conditions of this
Public License.
b. Additional offer from the Licensor -- Adapted Material.
Every recipient of Adapted Material from You
automatically receives an offer from the Licensor to
exercise the Licensed Rights in the Adapted Material
under the conditions of the Adapter's License You apply.
c. No downstream restrictions. You may not offer or impose
any additional or different terms or conditions on, or
apply any Effective Technological Measures to, the
Licensed Material if doing so restricts exercise of the
Licensed Rights by any recipient of the Licensed
Material.
6. No endorsement. Nothing in this Public License constitutes or
may be construed as permission to assert or imply that You
are, or that Your use of the Licensed Material is, connected
with, or sponsored, endorsed, or granted official status by,
the Licensor or others designated to receive attribution as
provided in Section 3(a)(1)(A)(i).
b. Other rights.
1. Moral rights, such as the right of integrity, are not
licensed under this Public License, nor are publicity,
privacy, and/or other similar personality rights; however, to
the extent possible, the Licensor waives and/or agrees not to
assert any such rights held by the Licensor to the limited
extent necessary to allow You to exercise the Licensed
Rights, but not otherwise.
2. Patent and trademark rights are not licensed under this
Public License.
3. To the extent possible, the Licensor waives any right to
collect royalties from You for the exercise of the Licensed
Rights, whether directly or through a collecting society
under any voluntary or waivable statutory or compulsory
licensing scheme. In all other cases the Licensor expressly
reserves any right to collect such royalties.
Section 3 -- License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the
following conditions.
a. Attribution.
1. If You Share the Licensed Material (including in modified
form), You must:
a. retain the following if it is supplied by the Licensor
with the Licensed Material:
i. identification of the creator(s) of the Licensed
Material and any others designated to receive
attribution, in any reasonable manner requested by
the Licensor (including by pseudonym if
designated);
ii. a copyright notice;
iii. a notice that refers to this Public License;
iv. a notice that refers to the disclaimer of
warranties;
v. a URI or hyperlink to the Licensed Material to the
extent reasonably practicable;
b. indicate if You modified the Licensed Material and
retain an indication of any previous modifications; and
c. indicate the Licensed Material is licensed under this
Public License, and include the text of, or the URI or
hyperlink to, this Public License.
2. You may satisfy the conditions in Section 3(a)(1) in any
reasonable manner based on the medium, means, and context in
which You Share the Licensed Material. For example, it may be
reasonable to satisfy the conditions by providing a URI or
hyperlink to a resource that includes the required
information.
3. If requested by the Licensor, You must remove any of the
information required by Section 3(a)(1)(A) to the extent
reasonably practicable.
b. ShareAlike.
In addition to the conditions in Section 3(a), if You Share
Adapted Material You produce, the following conditions also apply.
1. The Adapter's License You apply must be a Creative Commons
license with the same License Elements, this version or
later, or a BY-SA Compatible License.
2. You must include the text of, or the URI or hyperlink to, the
Adapter's License You apply. You may satisfy this condition
in any reasonable manner based on the medium, means, and
context in which You Share Adapted Material.
3. You may not offer or impose any additional or different terms
or conditions on, or apply any Effective Technological
Measures to, Adapted Material that restrict exercise of the
rights granted under the Adapter's License You apply.
Section 4 -- Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that
apply to Your use of the Licensed Material:
a. for the avoidance of doubt, Section 2(a)(1) grants You the right
to extract, reuse, reproduce, and Share all or a substantial
portion of the contents of the database;
b. if You include all or a substantial portion of the database
contents in a database in which You have Sui Generis Database
Rights, then the database in which You have Sui Generis Database
Rights (but not its individual contents) is Adapted Material,
including for purposes of Section 3(b); and
c. You must comply with the conditions in Section 3(a) if You Share
all or a substantial portion of the contents of the database.
For the avoidance of doubt, this Section 4 supplements and does not
replace Your obligations under this Public License where the Licensed
Rights include other Copyright and Similar Rights.
Section 5 -- Disclaimer of Warranties and Limitation of Liability.
a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
c. The disclaimer of warranties and limitation of liability provided
above shall be interpreted in a manner that, to the extent
possible, most closely approximates an absolute disclaimer and
waiver of all liability.
Section 6 -- Term and Termination.
a. This Public License applies for the term of the Copyright and
Similar Rights licensed here. However, if You fail to comply with
this Public License, then Your rights under this Public License
terminate automatically.
b. Where Your right to use the Licensed Material has terminated under
Section 6(a), it reinstates:
1. automatically as of the date the violation is cured, provided
it is cured within 30 days of Your discovery of the
violation; or
2. upon express reinstatement by the Licensor.
For the avoidance of doubt, this Section 6(b) does not affect any
right the Licensor may have to seek remedies for Your violations
of this Public License.
c. For the avoidance of doubt, the Licensor may also offer the
Licensed Material under separate terms or conditions or stop
distributing the Licensed Material at any time; however, doing so
will not terminate this Public License.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
License.
Section 7 -- Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different
terms or conditions communicated by You unless expressly agreed.
b. Any arrangements, understandings, or agreements regarding the
Licensed Material not stated herein are separate from and
independent of the terms and conditions of this Public License.
Section 8 -- Interpretation.
a. For the avoidance of doubt, this Public License does not, and
shall not be interpreted to, reduce, limit, restrict, or impose
conditions on any use of the Licensed Material that could lawfully
be made without permission under this Public License.
b. To the extent possible, if any provision of this Public License is
deemed unenforceable, it shall be automatically reformed to the
minimum extent necessary to make it enforceable. If the provision
cannot be reformed, it shall be severed from this Public License
without affecting the enforceability of the remaining terms and
conditions.
c. No term or condition of this Public License will be waived and no
failure to comply consented to unless expressly agreed to by the
Licensor.
d. Nothing in this Public License constitutes or may be interpreted
as a limitation upon, or waiver of, any privileges and immunities
that apply to the Licensor or You, including from the legal
processes of any jurisdiction or authority.
=======================================================================
Creative Commons is not a party to its public
licenses. Notwithstanding, Creative Commons may elect to apply one of
its public licenses to material it publishes and in those instances
will be considered the “Licensor.” The text of the Creative Commons
public licenses is dedicated to the public domain under the CC0 Public
Domain Dedication. Except for the limited purpose of indicating that
material is shared under a Creative Commons public license or as
otherwise permitted by the Creative Commons policies published at
creativecommons.org/policies, Creative Commons does not authorize the
use of the trademark "Creative Commons" or any other trademark or logo
of Creative Commons without its prior written consent including,
without limitation, in connection with any unauthorized modifications
to any of its public licenses or any other arrangements,
understandings, or agreements concerning use of licensed material. For
the avoidance of doubt, this paragraph does not form part of the
public licenses.
Creative Commons may be contacted at creativecommons.org.

View File

@ -8,7 +8,7 @@ log
transmits messages from traveling ships, remote outposts, and new human
colonies via Quantum Entaglement Communicator (QEC) half-duplex, phase-shift
keying multilevel modulation.
.PP
.P
Messages are queued in the ship's draft system. A call to
.B log
then queries those messages in the queue and waits for human confirmation
@ -16,7 +16,7 @@ that the draft is ready to be sent. When approved,
.B log
will query for a subject, topic, or title for the message. Finally the
message is sent to the relay paired with the QEC during construction.
.PP
.P
There is no recall method to the QEC system. Messages sent cannot be removed,
however, due to the nature of qubits, the message can be modified after
transmission by editing the original draft.
@ -24,7 +24,5 @@ transmission by editing the original draft.
Systems with abundant quantities of exotic or phase-shifted matter may
encounter delays in communication, time shifting, and rare cases, a reverse
in localized time of log receipts.
.SH SEE ALSO
ship(1)
.SH AUTHOR
Yin, Juan; Cao, Yuan; Yong, Hai-Lin; Ren, Ji-Gang

View File

@ -1,73 +0,0 @@
.TH COSMIC.VOYAGE 1 "20 Nov 2018"
.SH NAME
cosmic.voyage - humanity's stellar diaspora
.SH DESRIPTION
.PP
.B cosmic.voyage
is a public access unix system (pubnix) and part of the tilde
(tildeverse) community of micro-instances offering free shell
accounts. It exists primarily to author and promote
a collaborative science-fiction universe. A secondary goal is the
promotion of command-line skills in *nix systems. The use of plain
text tools and command line interfaces is both a thematic choice
and technical practice.
.SH STORY
Our users write stories as the people aboard ships, colonies, and
outposts, using the only remaining free, interconnected network
that unites the dispersed peoples of the stars.
.PP
The
.B Quantum Entanglement Communicator
or
.B QEC
is the a device that bridges the vast distances of space with near-
instantaneous communication. Unfortunately, it provides only
a limited bandwidth to the ancient relay hub in the SOL system. It
is enough for only simple, plain-text messaging.
.PP
The ships in our story have all left Earth behind at different
times, and in some cases they've left from different realities.
The QEC bridges all these gaps, uniting ships across time and
space in the strangest of ways. Records are stored chronologically
on the relay hub as they are received, but their source
transmissions are often wildly out of sync.
.SH GETTING STARTED
.PP
New users are greeted with a welcome email upon the creation of
their account that provides information on creating a ship, the
structure of files and folders, and instructions for creating logs
to the QEC. This welcome email can be read using the programs
.B alpine
or
.B mutt.
.PP
New users may also find it useful to use the interactive menu
system by running the
.B menu
command.
.PP
Finally, users may find up-to-date comprehensive guides on the
system wiki by running the
.B wiki
command.
.SH NOTES
This is a full Ubuntu environment and allows users to do far more
than simply write stories. Feel free to take advantage of the
tools available here to experiment with other aspects of the
command line. We have many programming languages / compilers
installed.
.PP
Users are also allowed to run reoccuring or scheduled tasks using
cron-jobs. If you do this, please include `/usr/bin/nice -n 19'
before any tasks you run to minimize the system load over time.
.SH BUGS
There are probably many bugs in this system. Please report
anything you find by mailing
.B tomasino@cosmic.voyage
or finding us on irc.tilde.chat in the #cosmic room.
.SH AUTHOR
Cosmic Voyage was created by James Tomasino, but the works of
fiction for each ship are the results of the individual authors on
this system. Run the
.B roster
command to see who is responsible for each ship.

View File

@ -1,30 +0,0 @@
.TH SHIP 1 "11 Jun 2033"
.SH NAME
ship \- Register Ship with Quantum Entanglement Communicator
.SH SYNOPSIS
ship
.SH DESRIPTION
.B ship
registers a ship, colony, outpost, settlement, or other stellar habitat as a
paired system with the Quantum Entanglement Communicator (QEC). Upon
registering, the local habitat will generate a prime qubit interface with
the relay system indicated, establishing spooky action at a distance (SAAD).
The QEC operates at half-duplex, phase-shift keying multilevel modulation with
the local habitat.
.PP
A local message queue is created in the ship's draft system. This queue can be
modified, appended, or otherwise manipulated by the local habitat. When a
transmission of the local queue is desired, the habitat operators can utilize
the
.B log
command to trigger the QEC relay.
.SH BUGS
Due to limitations in the archaic design of the QEC interface, ship names must
use the ASCII character set. Extended unicode is permissable within the relayed
content, however.
.PP
Report all other issues using the QEC.
.SH SEE ALSO
log(1)
.SH AUTHOR
Written by Juan Yin and Niels Anderssen

View File

@ -1,163 +0,0 @@
#!/usr/bin/pdmenu
title:Cosmic Voyage
# desktop The space over which the menus appear.
# title The line at the top of the screen.
# base The line at the bottom of the screen.
# menu The normal color of text in a menu.
# selbar The selection bar in the menu, when over normal text.
# shadow The shadow of a window
# menuhot The color of text in a menu that is a hotkey.
# selbarhot The color of a hotkey when the selection bar is over it.
# unselmenu The color of a menu window that is not currently active.
# possible colors
# (bg valid) (fg only)
# black gray
# red brightred
# green brightgreen
# brown yellow
# blue brightblue
# magenta brightmagenta
# cyan brightcyan
# lightgray white
#Set a pleasing color scheme.
color:desktop:white:black
color:title:white:red
color:base:lightgray:red
color:menu:lightgray:blue
color:selbar:lightgray:red
color:shadow:gray:black
color:menuhot:white:blue
color:selbarhot:white:red
color:unselmenu:lightgray:black
#this is a comment
menu:main:Main Menu:Cosmic Voyage Menu System v1.0
show:Cosmic _Tools..::cosmic
show:_Communication..::comms
show:_Fun & Games..::games
nop
exec:_Wiki::/usr/local/bin/wiki
exec:_FAQ::/usr/local/bin/faq
nop
exit:E_xit
menu:comms:Communication:Reach out and touch someone
exec:_Mail (alpine)::/usr/bin/alpine
exec:_Mail (mutt)::/usr/bin/mutt
exec:tilde _net news (forums)::/usr/local/bin/news
exec:_bbj (Bulletin Butter & Jelly!)::/usr/local/bin/bbj
exec:_fellowsh::clear;/usr/local/bin/fellowsh
exec:_IRC (weechat)::/usr/local/bin/chat
exec:i_ris (Serverless text-based forum for tilde-likes)::/usr/local/bin/iris
group:_Finger..
exec::makemenu: \
echo "menu:finger:Finger:Finger other cosmic users"; \
for u in `/usr/local/bin/voyagers | sort`; do \
echo "exec:$u:truncate:/usr/bin/finger ${u}@cosmic.voyage"; \
done; \
echo "nop"; \
echo "exec:_Remote User:truncate,edit:/usr/bin/finger \"~user name:~\""; \
echo "nop"; \
echo "exit:E_xit"
show:::finger
remove:::finger
endgroup
group:_Talk..
exec::makemenu: \
echo "menu:talk:Talk:Talk to other users"; \
for u in `/usr/bin/who | /usr/bin/cut -f 1 -d " "| /usr/bin/sort -u `; do \
echo "exec:$u::/usr/local/bin/ytalk $u"; \
done; \
echo "nop"; \
echo "exit:E_xit"
show:::talk
remove:::talk
endgroup
group:_Unison (folder sync)..
exec::makemenu: \
echo "menu:unison:Unison:Synchronize folders to other systems"; \
for f in ~/.unison/*.prf; do \
profile="$(basename $f)"; \
profile="${profile%.*}"; \
echo "exec:profile\: $profile::/usr/bin/unison $profile"; \
done; \
echo "exec:_New command:truncate,edit:/usr/bin/unison \"~[ships/] [ssh\://remote/folder]:~\""; \
echo "nop"; \
echo "exit:E_xit"
show:::unison
remove:::unison
endgroup
exec:_Project Files::/usr/local/bin/projects
exec:_webfinger (link your fediverse account)::/usr/local/bin/webfinger
nop
exit:E_xit
menu:games:Fun & Games:Games and fun distractions
exec:_Allegra::/usr/bin/rlwrap nc localhost 1822
exec:_Alone Among the Stars:truncate:/usr/local/bin/alone | par -w 60
exec:_Among Sus::/usr/bin/rlwrap nc sus.tildeverse.org 1234
exec:_Bastard Tetris::/usr/games/bastet
show:_Botany..::botany
exec:_cbonsai::/usr/local/bin/cbonsai --live
exec:_chess::/usr/local/bin/chs
exec:clidle (wordle)::/usr/games/clidle
group:_Crossword..
exec::makemenu: \
echo "menu:crossword:Crossword:Play Crossword Puzzles"; \
for c in `/usr/local/bin/crossword`; do \
echo "exec:$c::/usr/local/bin/crossword ${c}"; \
done; \
echo "nop"; \
echo "exit:E_xit"
show:::crossword
remove:::crossword
endgroup
exec:_Dungeon Crawl Stone Soup::/usr/local/bin/dcss
exec:_Fortune:truncate:/usr/games/fortune | par -w 60
exec:_Freesweep::/usr/games/freesweep
exec:_Go::/usr/games/gnugo
exec:_Gorched::/snap/bin/gorched
exec:Greed::/usr/games/greed
exec:_I Ching::/usr/games/iching
exec:_JPL Horizons::telnet horizons.jpl.nasa.gov 6775
exec:_Moon Buggy::/usr/games/moon-buggy
exec:Multi_Zork::/usr/bin/rlwrap nc multizork.icculus.org 23
exec:_Nethack::/usr/games/nethack-console
exec:_Random Chess Endgame Puzzle:truncate:shuf -n 1 /var/packages/fen/endgames-fen.txt | xargs fen
exec:_SLASHEM (Nethack clone)::/usr/games/slashem
exec:_Space Invaders::/usr/games/ninvaders
exec:_Sudoku::/usr/games/nudoku
exec:_Tron::ssh sshtron.zachlatta.com
exec:_Zangband::/usr/games/zangband
exec:2048::/usr/games/2048
nop
exit:_Back to main menu..
menu:cosmic:Cosmic Tools:Tools related to the cosmic voyage story
exec:_QEC browser::/usr/local/bin/qec
exec:_Recent QEC logs:truncate:/usr/local/bin/latest
exec:_Rate of QEC logs:truncate:/usr/local/bin/rate
exec:High _Scores:truncate:/usr/local/bin/scores | column -t -s,
nop
show:_Write a new message..::write
exec:_Log a new message::/usr/local/bin/log
exec:_Dictionary/Thesaurus..:truncate,edit:/usr/bin/sdcv -n --utf8-output "~word:~"
nop
exec:_Author and Ship Lists:truncate,edit:/usr/local/bin/roster "~user or ship name (or blank for all):~"
exec:_Create a new ship::/usr/local/bin/ship
nop
exit:_Back to main menu..
menu:botany:Botany Tools:Tools related to botany
exec:_Botany::/usr/local/bin/botany
exec:_List Living Plants:truncate:/usr/local/bin/wilty list
exec:_Water Random Plant:truncate:/usr/local/bin/wilty water
nop
exit:_Back to main menu..
# write a message menu
preproc:/usr/local/bin/menu_write

523
pkglist
View File

@ -1,523 +0,0 @@
accountsservice
acpid
adduser
alpine
apparmor
apport
apport-symptoms
apt
apt-file
apt-transport-https
apt-utils
asciidoc
asciinema
aspell
at
autossh
base-files
base-passwd
bash
bash-completion
bastet
bat
bc
bcache-tools
bind9
bind9-host
bsdgames
bsdmainutils
bsdutils
btrfs-progs
build-essential
busybox-initramfs
busybox-static
byobu
ca-certificates
calc
certbot
cloud-guest-utils
cloud-initramfs-copymods
cloud-initramfs-dyn-netconf
command-not-found
coreutils
cowsay
cpio
cron
cryptsetup
cryptsetup-bin
cryptsetup-initramfs
cryptsetup-run
curl
dash
dav-text
dbus
debconf
debconf-i18n
debian-goodies
dict
diction
diffutils
dirmngr
dmeventd
dmidecode
dmsetup
dnsutils
dosfstools
dovecot-imapd
dovecot-pop3d
dovecot-sieve
dpkg
e2fsprogs
e3
ed
efingerd
efte
eject
elvis-tiny
elvish
emacs
emacs-nox
ethtool
fail2ban
fdisk
figlet
file
finalrd
findutils
finger
fish
fonts-ubuntu-console
fortune-mod
freesweep
friendly-recovery
fte-terminal
ftp
fuse
gawk
gcc
gcc-8-base
geoip-database
gettext-base
git
git-man
gnat
gnupg
gnupg-l10n
gnupg-utils
gnutls-bin
goaccess
gpg
gpg-agent
gpg-wks-client
gpg-wks-server
gpgconf
gpgsm
gpgv
greed
grep
groff
groff-base
grub-common
grub-pc
gzip
hdparm
hostname
html2text
htop
info
init
init-system-helpers
initramfs-tools
initramfs-tools-bin
initramfs-tools-core
inn2
install-info
installation-report
iptables
iputils-tracepath
irqbalance
irssi
iso-codes
jed
joe
jq
kakoune
klibc-utils
kmod
krb5-locales
ksh
landscape-common
language-pack-en
language-selector-common
libaccountsservice0
libacl1
libapparmor1
libasn1-8-heimdal
libassuan0
libattr1
libaudit-common
libaudit1
libblkid1
libbz2-1.0
libc6
libcap-ng0
libcom-err2
libcurl3-gnutls
libcurl4
libdb5.3
libdbus-1-3
libdebconfclient0
libdevmapper-event1.02.1
libdevmapper1.02.1
libdrm-common
libdrm2
libdumbnet1
libedit2
libelf1
liberror-perl
libexpat1
libext2fs2
libfdisk1
libfuse2
libgcc1
libgcrypt20
libgdbm-compat4
libgeoip1
libglib2.0-0
libglib2.0-data
libgmp10
libgnutls-dane0
libgnutls-openssl27
libgnutls28-dev
libgnutls30
libgnutlsxx28
libgpg-error0
libgpm2
libgssapi-krb5-2
libgssapi3-heimdal
libgtk-3-common
libhcrypto4-heimdal
libheimbase1-heimdal
libheimntlm0-heimdal
libhx509-5-heimdal
libidn2-0
libiptc0
libisns0
libk5crypto3
libkeyutils1
libklibc
libkmod2
libkrb5-26-heimdal
libkrb5-3
libkrb5support0
libksba8
libldap-2.4-2
libldap-common
liblocale-gettext-perl
liblua5.2-dev
liblz4-1
liblzma5
liblzo2-2
libmariadbclient-dev
libmaxminddb-dev
libmaxminddb0
libmount1
libmpfr6
libmspack0
libncurses5-dev
libncurses6
libncursesw5-dev
libncursesw6
libnetfilter-conntrack3
libnfnetlink0
libnghttp2-14
libnpth0
libnuma1
libp11-kit0
libpam-cracklib
libpam-modules
libpam-modules-bin
libpam-systemd
libpam0g
libparted2
libpcap0.8
libpci3
libpcre3
libpipeline1
libpng16-16
libpolkit-agent-1-0
libpolkit-gobject-1-0
libpq-dev
libpq5
libpsl5
libreadline5
libroken18-heimdal
librtmp1
libsasl2-2
libsasl2-modules
libsasl2-modules-db
libsdl2-2.0-0
libsdl2-dev
libsdl2-image-2.0-0
libsdl2-mixer-2.0-0
libsdl2-ttf-dev
libseccomp2
libselinux1
libsemanage-common
libsemanage1
libsepol1
libsigsegv2
libsmartcols1
libss2
libssl-dev
libssl1.1
libstdc++6
libsystemd0
libtasn1-6
libtermkey-dev
libtext-charwidth-perl
libtext-iconv-perl
libtext-wrapi18n-perl
libtinfo-dev
libtinfo6
libtre-dev
libtre5
libudev1
libunistring2
libunwind8
libusb-1.0-0
libutempter0
libuuid1
libwind0-heimdal
libwrap0
libx11-6
libx11-data
libxau6
libxcb1
libxdmcp6
libxext6
libxft-dev
libxml2
libxmlsec1
libxmlsec1-openssl
libxmuu1
libxslt1.1
libzstd1
linux-base
linux-generic
linux-headers-generic
locales
login
logrotate
lolcat
lpe
lsb-base
lshw
lsof
ltrace
lua5.2
luarocks
lvm2
lynx
lzip
make
man-db
manpages
mawk
mc
mdadm
members
mg
micro
mime-support
mlocate
moon-buggy
mosh
mtr-tiny
mutt
nano
ncdu
ncurses-base
ncurses-bin
ncurses-term
ne
ne-doc
neomutt
neovim
net-tools
nethack-console
newmail
nginx
ninja-build
ninvaders
nodejs
ntfs-3g
nudoku
nvi
nvi-doc
oidentd
open-iscsi
open-vm-tools
openbsd-inetd
openssh-client
openssh-server
openssh-sftp-server
openssl
overlayroot
pandoc
par
parted
passwd
pastebinit
patch
pciutils
pdmenu
perl
perl-base
pinentry-curses
pkg-config
plymouth
plymouth-theme-ubuntu-text
policykit-1
pollinate
popularity-contest
postfix
powermgmt-base
procps
psmisc
publicsuffix
pwgen
python-apt-common
python-is-python2
python-setuptools
python3
python3-apport
python3-apt
python3-asn1crypto
python3-attr
python3-automat
python3-certbot-nginx
python3-certifi
python3-cffi-backend
python3-chardet
python3-click
python3-colorama
python3-commandnotfound
python3-configobj
python3-constantly
python3-cryptography
python3-debconf
python3-debian
python3-dev
python3-distro-info
python3-distupgrade
python3-gdbm
python3-httplib2
python3-hyperlink
python3-idna
python3-incremental
python3-neovim
python3-newt
python3-openssl
python3-pam
python3-pip
python3-pkg-resources
python3-problem-report
python3-proselint
python3-pyasn1
python3-pyasn1-modules
python3-requests
python3-requests-unixsocket
python3-serial
python3-service-identity
python3-setuptools
python3-six
python3-software-properties
python3-systemd
python3-twisted
python3-twisted-bin
python3-update-manager
python3-urllib3
python3-venv
python3-virtualenv
python3-zope.interface
ranger
rclone
recutils
rsync
run-one
s-nail
screen
sdcv
sed
sensible-utils
shared-mime-info
shellcheck
silversearcher-ag
slrn
snapd
software-properties-common
sosreport
sqlite3
squashfs-tools
ssh-import-id
stow
strace
stunnel4
sysstat
sysvinit-utils
talk
talkd
tar
tasksel
tcl
tcl-dev
tcpd
tcpdump
telnet
the
tig
tilde
time
tin
tmux
tor
torsocks
tree
ubuntu-keyring
ubuntu-minimal
ubuntu-release-upgrader-core
ubuntu-server
ubuntu-standard
ucf
udev
ufw
unattended-upgrades
units
unzip
update-manager-core
update-motd
update-notifier-common
usbutils
util-linux
uucp
uuid-runtime
vim
vim-athena
vim-gtk
vim-runtime
virtualenv
weechat
wget
x11-apps
xauth
xdg-user-dirs
xfsprogs
xsel
yarn
zangband
zerofree
zile
zlib1g
zlib1g-dev
zsh

View File

@ -1,92 +0,0 @@
acme==1.1.0
appdirs==1.4.3
asciinema==2.0.2
asn1crypto==0.24.0
attrs==19.3.0
Automat==0.8.0
AV-98==1.0.0
blessed==1.15.0
blinker==1.4
certbot==0.40.0
certbot-nginx==0.40.0
certifi==2019.11.28
chardet==3.0.4
Click==7.0
colorama==0.4.3
command-not-found==0.3
ConfigArgParse==0.13.0
configobj==5.0.6
constantly==15.1.0
cryptography==2.8
cursewords==1.0.4
dbus-python==1.2.16
distlib==0.3.0
distro==1.4.0
distro-info===0.23ubuntu1
entrypoints==0.3
fail2ban==0.11.1
filelock==3.0.12
future==0.18.2
greenlet==0.4.15
httplib2==0.14.0
hyperlink==19.0.0
idna==2.8
importlib-metadata==1.5.0
incremental==16.10.1
isc==2.0
Jetforce==0.4.0
josepy==1.2.0
keyring==18.0.1
language-selector==0.1
launchpadlib==1.10.13
lazr.restfulclient==0.14.2
lazr.uri==1.0.3
mock==3.0.5
more-itertools==4.2.0
msgpack==0.6.2
netifaces==0.10.4
oauthlib==3.1.0
PAM==0.4.2
parsedatetime==2.4
pbr==5.4.5
ply==3.11
proselint==0.10.2
puzpy==0.2.4
pyasn1==0.4.2
pyasn1-modules==0.2.1
PyGObject==3.36.0
PyHamcrest==1.9.0
PyJWT==1.7.1
pynvim==0.4.1
pyOpenSSL==19.0.0
pyparsing==2.4.6
pyRFC3339==1.1
pyserial==3.4
python-apt==2.0.0+ubuntu0.20.4.1
python-debian===0.1.36ubuntu1
pytz==2019.3
PyYAML==5.3.1
ranger-fm==1.9.3
requests==2.22.0
requests-toolbelt==0.8.0
requests-unixsocket==0.2.0
SecretStorage==2.3.1
service-identity==18.1.0
simplejson==3.16.0
six==1.14.0
ssh-import-id==5.10
systemd-python==234
Twisted==20.3.0
ubuntu-advantage-tools==20.3
ufw==0.36
unattended-upgrades==0.1
urllib3==1.25.8
urwid==2.1.0
virtualenv==20.0.17
wadllib==1.3.3
wcwidth==0.1.9
zipp==1.0.0
zope.component==4.3.0
zope.event==4.4
zope.hookable==5.0.0
zope.interface==4.7.1

View File

@ -1,17 +0,0 @@
2048-cli https://github.com/tiehuis/2048-cli.git
burrow https://github.com/jamestomasino/burrow.git
fellowsh git://circumlunar.space/fellowsh
goaccess-1.3
gophernicus https://github.com/kimholviala/gophernicus.git
mg-3.4
moe-1.10
mp-5.x https://github.com/ttcdt/mp-5.x.git
mpdm https://github.com/ttcdt/mpdm.git
mpsl https://github.com/ttcdt/mpsl.git
pb https://tildegit.org/tomasino/pb.git
sacc git://bitreich.org/sacc/
sam https://github.com/deadpixi/sam.git
se-3.0.1
teco-ecc015f68b
tinyfugue https://github.com/kruton/tinyfugue.git
vis-0.6

View File

@ -1,46 +0,0 @@
cosmic.voyage permit_auth_destination
.aussies.space permit_auth_destination
.circumlunar.space permit_auth_destination
.hashbang.sh permit_auth_destination
.thunix.cf permit_auth_destination
.thunix.net permit_auth_destination
.tildeverse.org permit_auth_destination
hmm.st permit_auth_destination
aussies.space permit_auth_destination
circumlunar.space permit_auth_destination
ctrl-c.club permit_auth_destination
envs.net permit_auth_destination
radiofreqs.space permit_auth_destination
rw.rs permit_auth_destination
fuckup.club permit_auth_destination
grex.org permit_auth_destination
hashbang.sh permit_auth_destination
nand.sh permit_auth_destination
rawtext.club permit_auth_destination
sdf.org permit_auth_destination
sdf-eu.org permit_auth_destination
thunix.cf permit_auth_destination
thunix.net permit_auth_destination
tild3.org permit_auth_destination
tilde.chat permit_auth_destination
tilde.club permit_auth_destination
tilde.green permit_auth_destination
tilde.institute permit_auth_destination
tilde.life permit_auth_destination
tilde.news permit_auth_destination
tilde.one permit_auth_destination
tilde.pink permit_auth_destination
tilde.site permit_auth_destination
tilde.team permit_auth_destination
tilde.town permit_auth_destination
tilde.wiki permit_auth_destination
tilde.wtf permit_auth_destination
tilde.zone permit_auth_destination
tildegit.org permit_auth_destination
tildenet.org permit_auth_destination
tilderadio.org permit_auth_destination
tildeteam.org permit_auth_destination
tildeverse.org permit_auth_destination
ttm.sh permit_auth_destination
yourtilde.com permit_auth_destination
sr.ht permit_auth_destination

Some files were not shown because too many files have changed in this diff Show More