Finished ui design, system dependency installs, nginx config file generation

This commit is contained in:
Mike Young
2019-12-29 00:18:11 -05:00
parent f23a05a9db
commit 5456ea477d
7 changed files with 103 additions and 53 deletions

2
config.json vendored
View File

@@ -1 +1 @@
{"TITLE": "pyShelf E-Book Server", "VERSION": "0.3.0", "BOOKPATH": "/home/raelon/Books", "DB_HOST": "localhost", "DB_PORT": "5432", "DATABASE": "pyshelf", "USER": "pyshelf", "PASSWORD": "pyshelf", "BOOKSHELF": "data/shelf.json", "ALLOWED_HOSTS": "*"} {"TITLE": "pyShelf E-Book Server", "VERSION": "0.3.0", "BOOKPATH": "/home/raelon/Books", "DB_HOST": "localhost", "DB_PORT": "5432", "DATABASE": "pyshelf", "USER": "pyshelf", "PASSWORD": "pyshelf", "BOOKSHELF": "data/shelf.json", "ALLOWED_HOSTS": "*", "hostname": "localhost", "webport": "8000", "wsgiport": "8001"}

82
install vendored
View File

@@ -1,8 +1,9 @@
#!/usr/bin/python3.8 #!/usr/bin/python3
import json import json
import os import os
import pathlib import pathlib
import platform import platform
import pprint
import subprocess as sp import subprocess as sp
import sys import sys
from shutil import copyfile from shutil import copyfile
@@ -10,6 +11,9 @@ from shutil import copyfile
import psutil import psutil
from src.backend.lib.display import TerminalDisplay from src.backend.lib.display import TerminalDisplay
log_file = "installer.log"
messages = []
class Configuration: class Configuration:
def __init__(self): def __init__(self):
@@ -110,6 +114,10 @@ class SystemInstaller:
for _installer in installers: for _installer in installers:
_fp = p + "/" + str(_installer["bin"]) _fp = p + "/" + str(_installer["bin"])
if os.path.isfile(_fp): if os.path.isfile(_fp):
global messages
messages = messages + [
"Found system installer binary " + str(_installer["bin"])
]
return _installer return _installer
def copy_config(self, _file=None, _dirs=None): def copy_config(self, _file=None, _dirs=None):
@@ -117,15 +125,42 @@ class SystemInstaller:
_file = self.nginx_conf _file = self.nginx_conf
if _dirs is None: if _dirs is None:
_dirs = self.site_dirs _dirs = self.site_dirs
outfile = "/%s" % _file.__str__()
if os.path.isdir(_dirs[0]):
os.system("sudo cp %s %s" % (_file, _dirs[0] + outfile))
else:
os.system("sudo mkdir %s" % _dirs[0])
os.system("sudo cp %s %s" % (_file, _dirs[0] + outfile))
try:
if os.path.isdir(_dirs[1]):
ln_string = str(_dirs[0] + outfile + " " + _dirs[1] + outfile)
os.system("sudo ln -s %s" % ln_string)
except Exception as e:
pass
"""
for r in _dirs: for r in _dirs:
copyfile(_file, r) if os.path.isdir(r):
os.system("sudo cp %s %s" % (_file, r+"/"+_file.__str__()))
else:
os.system("sudo mkdir %s" % r)
os.system("sudo cp %s %s" % (_file, r+"/"+_file.__str__()))
"""
return True return True
def make_nginx_config(self, answers): def make_nginx_config(self, answers):
breakpoint() root = os.path.abspath(".")
_fp = "pyshelf_nginx.conf"
for r in answers:
if r["name"] == "hostname":
hostname = r["answer"]
elif r["name"] == "webport":
port = r["answer"]
elif r["name"] == "wsgiport":
wsgiport = r["answer"]
nginx_conf_str = """ nginx_conf_str = """
# pyshelf_nginx.conf # pyshelf_nginx.conf
upstream django {server 127.0.0.1:8001;} upstream django {server 127.0.0.1:%s;}
server { server {
listen %s; listen %s;
server_name %s; server_name %s;
@@ -137,13 +172,32 @@ class SystemInstaller:
location / {uwsgi_pass django; include %s/uwsgi_params;} location / {uwsgi_pass django; include %s/uwsgi_params;}
} }
""" % ( """ % (
answers wsgiport,
port,
hostname,
root,
root,
root,
root,
) )
with open(_fp, "w") as write_file:
write_file.write(nginx_conf_str)
global messages
messages = messages + ["Generated new pyshelf_nginx.conf", nginx_conf_str]
def log(self):
global log_file
global messages
with open(log_file, "w") as write_file:
write_file.write(TerminalDisplay().banner_render())
for message in messages:
write_file.write(message + "\n")
messages = messages + ["Log file written to " + log_file.__str__()]
config = Configuration().open_file() config = Configuration().open_file()
installer = None sysinstall = SystemInstaller()
messages = [] installer = sysinstall.bin
# Get user configuration options # Get user configuration options
install_answers = TerminalDisplay().installer() install_answers = TerminalDisplay().installer()
for key in install_answers: for key in install_answers:
@@ -224,7 +278,6 @@ if RequiredServices().db_server_found(req) is False:
+ package + package
) )
install_status = os.system(cmd) install_status = os.system(cmd)
copy_config = SystemInstaller().copy_config()
srvc_start = os.system("sudo systemctl start postgresql") srvc_start = os.system("sudo systemctl start postgresql")
messages = messages + [ messages = messages + [
"PostgreSQL installed and started", "PostgreSQL installed and started",
@@ -232,12 +285,19 @@ if RequiredServices().db_server_found(req) is False:
" sudo systemctl enable nginx", " sudo systemctl enable nginx",
"\n", "\n",
] ]
if copy_config:
messages = messages + ["pyShelf site config copied to sites_enabled"] # Post install configurations
sysinstall.make_nginx_config(install_answers)
copy_config = sysinstall.copy_config()
if copy_config:
messages = messages + ["pyShelf site config copied to sites_enabled"]
# Display end screen # Display end screen
sysinstall.log()
TerminalDisplay().clear() TerminalDisplay().clear()
TerminalDisplay().h_rule() TerminalDisplay().banner()
for message in messages: for message in messages:
print(message) print(message)
print()
TerminalDisplay().h_rule() TerminalDisplay().h_rule()

2
pyproject.toml vendored
View File

@@ -7,4 +7,4 @@ use_parentheses = true
# NOTE: the known_third_party setting is managed by # NOTE: the known_third_party setting is managed by
# seed-isort-config and should not be modified directly. # seed-isort-config and should not be modified directly.
# Any changes made to this setting will be overwritten. # Any changes made to this setting will be overwritten.
known_third_party = ["backend", "bs4", "django", "interface", "prompt_toolkit", "psycopg2", "requests"] known_third_party = ["backend", "bs4", "django", "interface", "prompt_toolkit", "psycopg2", "pyfiglet", "requests"]

38
pyshelf_nginx.conf vendored
View File

@@ -1,38 +0,0 @@
# pyshelf_nginx.conf
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
listen 8000;
server_name 127.0.0.1; # substitute your machine's IP address or FQDN
charset utf-8;
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
# your Django project's media files - amend as required
alias /home/raelon/Projects/pyShelf/frontend/interface/media;
}
location /static {
# your Django project's static files - amend as required
alias /home/raelon/Projects/pyShelf/frontend/interface/static;
}
location /books {
# Absolute location of your ebook files
internal;
alias /home/raelon/Projects/pyShelf/books;
}
# Finally, send all non-media requests to the Django server.
location / {
# the uwsgi_params file you installed
uwsgi_pass django;
include /home/raelon/Projects/pyShelf/uwsgi_params;
}
}

1
requirements.txt vendored
View File

@@ -17,3 +17,4 @@ django-debug-toolbar
psycopg2-binary psycopg2-binary
prompt_toolkit prompt_toolkit
psutil psutil
pyfiglet

View File

@@ -2,6 +2,7 @@ from __future__ import unicode_literals
import os import os
import pyfiglet
from prompt_toolkit import prompt as prm from prompt_toolkit import prompt as prm
@@ -11,6 +12,11 @@ class TerminalDisplay:
self.w, self.y = os.get_terminal_size()[0], os.get_terminal_size()[1] self.w, self.y = os.get_terminal_size()[0], os.get_terminal_size()[1]
self.home = os.environ["HOME"] self.home = os.environ["HOME"]
self.user = os.environ["USER"] self.user = os.environ["USER"]
self.version = "0.4.0"
self.slogan = "Installer Initiative"
self.green = "\033[1;32m"
self.blue = "\033[94m"
self.clr_term = "\033[m"
def screen(self): def screen(self):
return self.term return self.term
@@ -84,7 +90,7 @@ class TerminalDisplay:
self.clear() self.clear()
answers = questions answers = questions
for answer in answers: for answer in answers:
self.h_rule() self.banner()
answer["answer"] = prm(answer["message"]) answer["answer"] = prm(answer["message"])
if answer["answer"] == "": if answer["answer"] == "":
answer["answer"] = answer["default"] answer["answer"] = answer["default"]
@@ -93,3 +99,25 @@ class TerminalDisplay:
def h_rule(self): def h_rule(self):
print("\u2501" * self.w) print("\u2501" * self.w)
def banner(self):
self.h_rule()
title = pyfiglet.Figlet(font="cyberlarge")
print(self.green + title.renderText("pyShelf") + self.clr_term)
print(
self.blue + " version " + self.version + self.clr_term + " " + self.slogan
)
self.h_rule()
print()
def banner_render(self):
title = pyfiglet.Figlet(font="cyberlarge")
_banner = (
title.renderText("pyShelf")
+ "\nversion "
+ self.version
+ " "
+ self.slogan
+ "\n"
)
return _banner

1
uwsgi.ini vendored
View File

@@ -1,5 +1,4 @@
[uwsgi] [uwsgi]
# chdir = {Full path to pyShelf/frontend}
chdir=/home/raelon/Projects/pyShelf/src chdir=/home/raelon/Projects/pyShelf/src
module=frontend.wsgi module=frontend.wsgi
master=True master=True