Compare commits
7 commits
59c116f1d1
...
554ceaf5be
Author | SHA1 | Date | |
---|---|---|---|
554ceaf5be | |||
8b49d6958c | |||
6a985e0b89 | |||
77e12933fd | |||
7c5916ceb0 | |||
2a32fee946 | |||
3dacff41a5 |
3 changed files with 216 additions and 196 deletions
205
build.py
205
build.py
|
@ -12,13 +12,13 @@ def run(*args):
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
time = datetime.datetime.now()
|
time = datetime.datetime.now()
|
||||||
time_id = time.strftime('%Y%m%d%H%M%S')
|
time_id = time.strftime("%Y%m%d%H%M%S")
|
||||||
style = 'css'
|
style = "css"
|
||||||
script = 'js'
|
script = "js"
|
||||||
root = os.path.dirname(os.path.realpath(__file__))
|
root = os.path.dirname(os.path.realpath(__file__))
|
||||||
input_directory = os.path.join(root, 'in')
|
input_directory = os.path.join(root, "in")
|
||||||
out = os.path.join(root, 'out')
|
out = os.path.join(root, "out")
|
||||||
web = os.path.join(out, 'web')
|
web = os.path.join(out, "web")
|
||||||
if os.path.exists(web):
|
if os.path.exists(web):
|
||||||
shutil.rmtree(web)
|
shutil.rmtree(web)
|
||||||
os.makedirs(web)
|
os.makedirs(web)
|
||||||
|
@ -26,17 +26,17 @@ def main():
|
||||||
css = os.path.join(gen, style)
|
css = os.path.join(gen, style)
|
||||||
js = os.path.join(gen, script)
|
js = os.path.join(gen, script)
|
||||||
#
|
#
|
||||||
run('rsync', '--archive', f'{input_directory}/', f'{web}/')
|
run("rsync", "--archive", f"{input_directory}/", f"{web}/")
|
||||||
for directory in [css, js]:
|
for directory in [css, js]:
|
||||||
os.makedirs(directory)
|
os.makedirs(directory)
|
||||||
#
|
#
|
||||||
link_gv = os.path.join(root, 'link.gv')
|
link_gv = os.path.join(root, "link.gv")
|
||||||
link_svg = os.path.join(gen, 'link.svg')
|
link_svg = os.path.join(gen, "link.svg")
|
||||||
run('dot', link_gv, '-Tsvg', '-o', link_svg)
|
run("dot", link_gv, "-Tsvg", "-o", link_svg)
|
||||||
with open(link_svg, 'br') as f:
|
with open(link_svg, "br") as f:
|
||||||
link_text = f.read().decode('u8')
|
link_text = f.read().decode("u8")
|
||||||
page_file = os.path.join(web, 'index.html')
|
page_file = os.path.join(web, "index.html")
|
||||||
page_text = f'''\
|
page_text = f"""\
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
|
|
||||||
<html>
|
<html>
|
||||||
|
@ -195,9 +195,9 @@ Last update: {time.strftime('%Y/%m/%d %H:%M:%S')}
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
'''
|
"""
|
||||||
css_file = os.path.join(css, 'index.css')
|
css_file = os.path.join(css, "index.css")
|
||||||
css_text = f'''\
|
css_text = """\
|
||||||
@media screen and (max-aspect-ratio: 10/16) {{
|
@media screen and (max-aspect-ratio: 10/16) {{
|
||||||
|
|
||||||
body {{
|
body {{
|
||||||
|
@ -327,9 +327,9 @@ border-color: rgb(255,0,255);
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
border-width: 1px;
|
border-width: 1px;
|
||||||
}}
|
}}
|
||||||
'''
|
"""
|
||||||
js_file = os.path.join(js, 'index.js')
|
js_file = os.path.join(js, "index.js")
|
||||||
js_text = f'''\
|
js_text = """\
|
||||||
function check(tab) {{
|
function check(tab) {{
|
||||||
const tabs = tab.split('/')
|
const tabs = tab.split('/')
|
||||||
let id = 'tab'
|
let id = 'tab'
|
||||||
|
@ -376,23 +376,23 @@ function main() {{
|
||||||
function swap() {{
|
function swap() {{
|
||||||
document.body.classList.toggle('dark')
|
document.body.classList.toggle('dark')
|
||||||
}}
|
}}
|
||||||
'''
|
"""
|
||||||
# {link_text}
|
# {link_text}
|
||||||
with open(page_file, 'bw') as f:
|
with open(page_file, "bw") as f:
|
||||||
f.write(page_text.encode('u8'))
|
f.write(page_text.encode("u8"))
|
||||||
with open(css_file, 'bw') as f:
|
with open(css_file, "bw") as f:
|
||||||
f.write(css_text.encode('u8'))
|
f.write(css_text.encode("u8"))
|
||||||
with open(js_file, 'bw') as f:
|
with open(js_file, "bw") as f:
|
||||||
f.write(js_text.encode('u8'))
|
f.write(js_text.encode("u8"))
|
||||||
|
|
||||||
|
|
||||||
tabs = {
|
tabs = {
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'about': f'''\
|
"about": """\
|
||||||
About…
|
About…
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'bio': f'''\
|
"bio": """\
|
||||||
<h1>Marc Beninca</h1>
|
<h1>Marc Beninca</h1>
|
||||||
Welcome to a recap attempt of my IT life!
|
Welcome to a recap attempt of my IT life!
|
||||||
|
|
||||||
|
@ -418,15 +418,15 @@ I had the occasion to develop projects in:
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
To be continued…
|
To be continued…
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'books': f'''\
|
"books": """\
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://www.tradepub.com">TradePub</a></li>
|
<li><a href="https://www.tradepub.com">TradePub</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'buy': f'''\
|
"buy": """\
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://www.i-comparateur.com">i-comparateur</a></li>
|
<li><a href="https://www.i-comparateur.com">i-comparateur</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -451,24 +451,24 @@ To be continued…
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://www.leboncoin.fr">Le bon coin</a></li>
|
<li><a href="https://www.leboncoin.fr">Le bon coin</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'comments': f'''\
|
"comments": """\
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://www.youtube.com/@LogicallyAnswered/videos">Logically Answered</a></li>
|
<li><a href="https://www.youtube.com/@LogicallyAnswered/videos">Logically Answered</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'cv': f'''\
|
"cv": """\
|
||||||
<ul class="cards">
|
<ul class="cards">
|
||||||
<li class="card"><a href="pdf/cv.en.pdf">
|
<li class="card"><a href="pdf/cv.en.pdf">
|
||||||
<img src="img/en.svg" /><br />English</a></li>
|
<img src="img/en.svg" /><br />English</a></li>
|
||||||
<li class="card"><a href="pdf/cv.fr.pdf">
|
<li class="card"><a href="pdf/cv.fr.pdf">
|
||||||
<img src="img/fr.svg" /><br />Français</a></li>
|
<img src="img/fr.svg" /><br />Français</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'repos': f'''\
|
"repos": """\
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://forge.rwx.work/marc.beninca">RWX</a></li>
|
<li><a href="https://forge.rwx.work/marc.beninca">RWX</a></li>
|
||||||
</ul><ul>
|
</ul><ul>
|
||||||
|
@ -509,9 +509,9 @@ To be continued…
|
||||||
<ul>
|
<ul>
|
||||||
<li>Gforge</li>
|
<li>Gforge</li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'health': f'''\
|
"health": """\
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://www.youtube.com/@chubbyemu/videos">Chubby Emu</a></li>
|
<li><a href="https://www.youtube.com/@chubbyemu/videos">Chubby Emu</a></li>
|
||||||
<li><a href="https://www.youtube.com/@drekberg/videos">Sten Ekberg</a></li>
|
<li><a href="https://www.youtube.com/@drekberg/videos">Sten Ekberg</a></li>
|
||||||
|
@ -524,9 +524,9 @@ To be continued…
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://www.youtube.com/@ivredevie/videos">Ivre de vie</a></li>
|
<li><a href="https://www.youtube.com/@ivredevie/videos">Ivre de vie</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'id': f'''\
|
"id": """\
|
||||||
<table>
|
<table>
|
||||||
|
|
||||||
<tr><th colspan="2">OpenPGP</th><td colspan="3" rowspan="4"><img src="img/marc.jpeg" /></td></tr>
|
<tr><th colspan="2">OpenPGP</th><td colspan="3" rowspan="4"><img src="img/marc.jpeg" /></td></tr>
|
||||||
|
@ -549,7 +549,7 @@ To be continued…
|
||||||
<td colspan="3"><a href="https://devs.live/users/marc_beninca">Pleroma</a></td>
|
<td colspan="3"><a href="https://devs.live/users/marc_beninca">Pleroma</a></td>
|
||||||
<td><a href="https://vimeo.com/marcbeninca">Vimeo</a></td>
|
<td><a href="https://vimeo.com/marcbeninca">Vimeo</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
<td colspan="2"><a href="https://peertube.iriseden.eu/a/marc_beninca">PeerTube</a></td>
|
<td colspan="2"><a href="https://videos.trom.tf/@marc_beninca">PeerTube</a></td>
|
||||||
<td><a href="https://openstreetmap.org/user/Marc Beninca">OpenStreetMap</a></td>
|
<td><a href="https://openstreetmap.org/user/Marc Beninca">OpenStreetMap</a></td>
|
||||||
<td><a href="https://youtube.com/@marc.beninca">YouTube</a></td>
|
<td><a href="https://youtube.com/@marc.beninca">YouTube</a></td>
|
||||||
</tr><tr>
|
</tr><tr>
|
||||||
|
@ -579,9 +579,9 @@ To be continued…
|
||||||
<tr><td colspan="2"><a href="https://forge.rwx.work/marc.beninca">forge.rwx.work</a></td></tr>
|
<tr><td colspan="2"><a href="https://forge.rwx.work/marc.beninca">forge.rwx.work</a></td></tr>
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'learn': f'''\
|
"learn": """\
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://roadmap.sh">Roadmap</a></li>
|
<li><a href="https://roadmap.sh">Roadmap</a></li>
|
||||||
<li><a href="https://teachyourselfcs.com">Teach Yourself Computer Science</a></li>
|
<li><a href="https://teachyourselfcs.com">Teach Yourself Computer Science</a></li>
|
||||||
|
@ -597,9 +597,9 @@ To be continued…
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://overthewire.org">Over The Wire</a></li>
|
<li><a href="https://overthewire.org">Over The Wire</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'links': f'''\
|
"links": """\
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://marc-beninca.8b.io">8bio</a></li>
|
<li><a href="https://marc-beninca.8b.io">8bio</a></li>
|
||||||
<li><a href="https://allmylinks.com/marc-beninca">AllMyLinks</a></li>
|
<li><a href="https://allmylinks.com/marc-beninca">AllMyLinks</a></li>
|
||||||
|
@ -639,9 +639,9 @@ To be continued…
|
||||||
<li><a href="https://vu.fr/marc-beninca">Vu.Fr</a></li>
|
<li><a href="https://vu.fr/marc-beninca">Vu.Fr</a></li>
|
||||||
<li><a href="https://zaap.bio/marc.beninca">Zaap</a></li>
|
<li><a href="https://zaap.bio/marc.beninca">Zaap</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'music': f'''\
|
"music": """\
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://www.youtube.com/watch?v=_ITiwPMUzho">3 AM Coding Session</a></li>
|
<li><a href="https://www.youtube.com/watch?v=_ITiwPMUzho">3 AM Coding Session</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -666,9 +666,9 @@ To be continued…
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="http://radio.garden/visit/pessac">Radio Garden</a></li>
|
<li><a href="http://radio.garden/visit/pessac">Radio Garden</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'profiles': f'''\
|
"profiles": """\
|
||||||
<ul class="cards">
|
<ul class="cards">
|
||||||
<li class="card"><a href="https://forge.rwx.work/marc.beninca">
|
<li class="card"><a href="https://forge.rwx.work/marc.beninca">
|
||||||
<img src="img/ForgeJo.svg" /><br />ForgeJo</a></li>
|
<img src="img/ForgeJo.svg" /><br />ForgeJo</a></li>
|
||||||
|
@ -679,7 +679,7 @@ To be continued…
|
||||||
</ul>
|
</ul>
|
||||||
<hr />
|
<hr />
|
||||||
<ul class="cards">
|
<ul class="cards">
|
||||||
<li class="card"><a href="https://peertube.iriseden.eu/c/marc.beninca">
|
<li class="card"><a href="https://videos.trom.tf/@marc.beninca">
|
||||||
<img src="img/PeerTube.png" /><br />PeerTube</a></li>
|
<img src="img/PeerTube.png" /><br />PeerTube</a></li>
|
||||||
<li class="card"><a href="https://pixelfed.social/marc.beninca">
|
<li class="card"><a href="https://pixelfed.social/marc.beninca">
|
||||||
<img src="img/PixelFed.svg" /><br />PixelFed</a></li>
|
<img src="img/PixelFed.svg" /><br />PixelFed</a></li>
|
||||||
|
@ -693,9 +693,9 @@ To be continued…
|
||||||
<li class="card"><a href="https://instagram.com/marc.beninca">
|
<li class="card"><a href="https://instagram.com/marc.beninca">
|
||||||
<img src="img/InstaGram.png" /><br />InstaGram</a></li>
|
<img src="img/InstaGram.png" /><br />InstaGram</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'lsgm': f'''\
|
"lsgm": """\
|
||||||
<h1>Live Scan Grub Menu</h1>
|
<h1>Live Scan Grub Menu</h1>
|
||||||
Setup a whole EFI System Partition:
|
Setup a whole EFI System Partition:
|
||||||
<ul>
|
<ul>
|
||||||
|
@ -708,8 +708,8 @@ BASH experimenting:
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://youtu.be/mx2lhm7qClc">2023/05/04: 1st boot into QCOW storage with encrypted data partition</a></li>
|
<li><a href="https://youtu.be/mx2lhm7qClc">2023/05/04: 1st boot into QCOW storage with encrypted data partition</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
'ofsp': f'''\
|
"ofsp": """\
|
||||||
<h1>Operating File System Profile</h1>
|
<h1>Operating File System Profile</h1>
|
||||||
Build from mirror a full operating system bootable file image:
|
Build from mirror a full operating system bootable file image:
|
||||||
<ul>
|
<ul>
|
||||||
|
@ -730,9 +730,9 @@ BASH experimenting:
|
||||||
<li><a href="https://youtu.be/YhoY2gisXg4">2023/06/20: Graphical User Interface too</a></li>
|
<li><a href="https://youtu.be/YhoY2gisXg4">2023/06/20: Graphical User Interface too</a></li>
|
||||||
<li><a href="https://youtu.be/PSHswxc9oU8">2023/06/13: Textual User Interface only</a></li>
|
<li><a href="https://youtu.be/PSHswxc9oU8">2023/06/13: Textual User Interface only</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'social': f'''\
|
"social": """\
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://calckey.org">Calckey</a></li>
|
<li><a href="https://calckey.org">Calckey</a></li>
|
||||||
<li><a href="https://joinmastodon.org">Mastodon</a></li>
|
<li><a href="https://joinmastodon.org">Mastodon</a></li>
|
||||||
|
@ -759,9 +759,9 @@ BASH experimenting:
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://nextdoor.com">NextDoor</a></li>
|
<li><a href="https://nextdoor.com">NextDoor</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'software': f'''\
|
"software": """\
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://developer.puri.sm/Librem5">Librem 5</a></li>
|
<li><a href="https://developer.puri.sm/Librem5">Librem 5</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -783,16 +783,16 @@ BASH experimenting:
|
||||||
<li><a href="https://www.talos.dev">Talos Linux</a></li>
|
<li><a href="https://www.talos.dev">Talos Linux</a></li>
|
||||||
<li><a href="https://www.endlessos.org/os">Endless OS</a></li>
|
<li><a href="https://www.endlessos.org/os">Endless OS</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'style': f'''\
|
"style": """\
|
||||||
<ul>
|
<ul>
|
||||||
<li><input type="checkbox" id="dark" onclick="swap()">Dark</input></li>
|
<li><input type="checkbox" id="dark" onclick="swap()">Dark</input></li>
|
||||||
<li><input type="checkbox" id="debug" onclick="debug()">Debug</input></li>
|
<li><input type="checkbox" id="debug" onclick="debug()">Debug</input></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'tasks': f'''\
|
"tasks": """\
|
||||||
<ul>
|
<ul>
|
||||||
<li>categorize music</li>
|
<li>categorize music</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -805,9 +805,9 @@ BASH experimenting:
|
||||||
<ul>
|
<ul>
|
||||||
<li>implement search</li>
|
<li>implement search</li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'tbm': f'''\
|
"tbm": """\
|
||||||
<ul class="cards">
|
<ul class="cards">
|
||||||
<li class="card"><a href="https://montempsreel.infotbm.com/arret/1224">Bertin → B</a></li>
|
<li class="card"><a href="https://montempsreel.infotbm.com/arret/1224">Bertin → B</a></li>
|
||||||
<li class="card"><a href="https://montempsreel.infotbm.com/arret/7">Bertin → V</a></li>
|
<li class="card"><a href="https://montempsreel.infotbm.com/arret/7">Bertin → V</a></li>
|
||||||
|
@ -816,9 +816,9 @@ BASH experimenting:
|
||||||
<li class="card"><a href="https://montempsreel.infotbm.com/arret/7802">Médiathèque → V</a></li>
|
<li class="card"><a href="https://montempsreel.infotbm.com/arret/7802">Médiathèque → V</a></li>
|
||||||
<li class="card"><a href="https://montempsreel.infotbm.com/arret/371">Peixotto → V</a></li>
|
<li class="card"><a href="https://montempsreel.infotbm.com/arret/371">Peixotto → V</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'trips': f'''\
|
"trips": """\
|
||||||
<ul>
|
<ul>
|
||||||
<li>Belgium<ul>
|
<li>Belgium<ul>
|
||||||
<li>Brussels</li>
|
<li>Brussels</li>
|
||||||
|
@ -860,9 +860,9 @@ BASH experimenting:
|
||||||
<li>Tennessee</li>
|
<li>Tennessee</li>
|
||||||
</ul></li>
|
</ul></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'vegan': f'''\
|
"vegan": """\
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://www.youtube.com/@CheapLazyVegan/videos">Cheap Lazy Vegan</a></li>
|
<li><a href="https://www.youtube.com/@CheapLazyVegan/videos">Cheap Lazy Vegan</a></li>
|
||||||
<li><a href="https://www.youtube.com/@gazoakleychef/videos">Gaz Oakley</a></li>
|
<li><a href="https://www.youtube.com/@gazoakleychef/videos">Gaz Oakley</a></li>
|
||||||
|
@ -886,9 +886,9 @@ BASH experimenting:
|
||||||
<li><a href="https://www.youtube.com/@MarieSweetandSour/videos">Marie Sweet and Sour</a></li>
|
<li><a href="https://www.youtube.com/@MarieSweetandSour/videos">Marie Sweet and Sour</a></li>
|
||||||
<li><a href="https://www.youtube.com/@SebastienKardinal/videos">Sébastien Kardinal</a></li>
|
<li><a href="https://www.youtube.com/@SebastienKardinal/videos">Sébastien Kardinal</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'others': f'''\
|
"others": """\
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://bsky.app/profile/marc-beninca.bsky.social">Blue Sky</a></li>
|
<li><a href="https://bsky.app/profile/marc-beninca.bsky.social">Blue Sky</a></li>
|
||||||
<li><a href="https://buymeacoffee.com/marc.beninca">Buy Me A Coffee</a></li>
|
<li><a href="https://buymeacoffee.com/marc.beninca">Buy Me A Coffee</a></li>
|
||||||
|
@ -902,7 +902,6 @@ BASH experimenting:
|
||||||
<li><a href="https://minds.com/marc_beninca">Minds</a></li>
|
<li><a href="https://minds.com/marc_beninca">Minds</a></li>
|
||||||
<li><a href="https://odysee.com/@marc.beninca">Odysee</a></li>
|
<li><a href="https://odysee.com/@marc.beninca">Odysee</a></li>
|
||||||
<li><a href="https://paypal.me/MarcBeninca">PayPal</a></li>
|
<li><a href="https://paypal.me/MarcBeninca">PayPal</a></li>
|
||||||
<li><a href="https://peertube.iriseden.eu/a/marc_beninca">PeerTube</a></li>
|
|
||||||
<li><a href="https://pinterest.com/marc_beninca">Pinterest</a></li>
|
<li><a href="https://pinterest.com/marc_beninca">Pinterest</a></li>
|
||||||
<li><a href="https://marcbeninca.podia.com">Podia</a></li>
|
<li><a href="https://marcbeninca.podia.com">Podia</a></li>
|
||||||
<li><a href="https://app.revolt.chat/invite/01FREKCG3P2P0YMAHQSCPSW4GD">Revolt</a></li>
|
<li><a href="https://app.revolt.chat/invite/01FREKCG3P2P0YMAHQSCPSW4GD">Revolt</a></li>
|
||||||
|
@ -918,15 +917,15 @@ BASH experimenting:
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="">KissBank</a></li>
|
<li><a href="">KissBank</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
#⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
# ⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅
|
||||||
'unsorted': f'''\
|
"unsorted": """\
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="https://foss.events">FOSS Events</a></li>
|
<li><a href="https://foss.events">FOSS Events</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
''',
|
""",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
86
pubnix.py
86
pubnix.py
|
@ -1,61 +1,83 @@
|
||||||
|
from __future__ import annotations
|
||||||
import os
|
import os
|
||||||
|
from pathlib import Path
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
PORT = 22
|
PORT = 22
|
||||||
USER = 'mspe'
|
USER = "mspe"
|
||||||
ROOT = 'public_html'
|
ROOT = "public_html"
|
||||||
PROTOCOL = 'https'
|
PROTOCOL = "https"
|
||||||
DIR = False
|
DIR = False
|
||||||
|
|
||||||
|
|
||||||
class PubNix:
|
class PubNix:
|
||||||
|
def __init__(
|
||||||
def __init__(self, dn,
|
self,
|
||||||
ssh=None, port=PORT, user=USER,
|
dn,
|
||||||
root=ROOT, dir=DIR, web=None, sub=None):
|
ssh: str | None = None,
|
||||||
|
port: int = PORT,
|
||||||
|
user: str = USER,
|
||||||
|
root: str = ROOT,
|
||||||
|
dir: bool = DIR,
|
||||||
|
web: str | None = None,
|
||||||
|
sub: bool | None = None,
|
||||||
|
):
|
||||||
self.dn = dn
|
self.dn = dn
|
||||||
self.ssh = f'{ssh}.{self.dn}' if ssh else self.dn
|
self.ssh = f"{ssh}.{self.dn}" if ssh else self.dn
|
||||||
self.port = port
|
self.port = port
|
||||||
self.user = user
|
self.user = user
|
||||||
self.root = root
|
self.root = root
|
||||||
self.web = f'{web}.{self.dn}' if web else self.dn
|
self.web = f"{web}.{self.dn}" if web else self.dn
|
||||||
if sub:
|
if sub:
|
||||||
self.fqdn = f'{self.user}.{self.web}'
|
self.fqdn = f"{self.user}.{self.web}"
|
||||||
self.context = None
|
self.context = None
|
||||||
else:
|
else:
|
||||||
self.fqdn = self.web
|
self.fqdn = self.web
|
||||||
self.context = f'~{self.user}'
|
self.context = f"~{self.user}"
|
||||||
self.path = os.path.join(self.root, self.fqdn) if dir else self.root
|
self.path = (Path(self.root) / self.fqdn) if dir else self.root
|
||||||
self.target = f'{self.user}@{self.ssh}:{self.path}'
|
self.target = f"{self.user}@{self.ssh}:{self.path}"
|
||||||
self.url = [f'{PROTOCOL}:', str(), self.fqdn]
|
self.url = [f"{PROTOCOL}:", "", self.fqdn]
|
||||||
if self.context:
|
if self.context:
|
||||||
self.url.append(self.context)
|
self.url.append(self.context)
|
||||||
self.url = '/'.join(self.url)
|
self.url = "/".join(self.url)
|
||||||
|
|
||||||
def capturun(self, *args):
|
def capturun(self, *args):
|
||||||
return self.run(*args, capture_output=True)
|
return self.run(*args, capture_output=True)
|
||||||
|
|
||||||
def run(self, *args, **kwargs):
|
def run(self, *args, **kwargs):
|
||||||
return subprocess.run(['ssh',
|
return subprocess.run(
|
||||||
'-o', 'LogLevel Error',
|
[
|
||||||
'-p', str(self.port),
|
"ssh",
|
||||||
f'{self.user}@{self.ssh}',
|
"-o",
|
||||||
'--',
|
"LogLevel Error",
|
||||||
*args,
|
"-p",
|
||||||
], **kwargs)
|
str(self.port),
|
||||||
|
f"{self.user}@{self.ssh}",
|
||||||
|
"--",
|
||||||
|
*args,
|
||||||
|
],
|
||||||
|
**kwargs,
|
||||||
|
)
|
||||||
|
|
||||||
def disk_free(self):
|
def disk_free(self) -> str:
|
||||||
process = self.capturun('df', '-h', os.curdir)
|
"""Fetch free space information."""
|
||||||
return process.stdout.decode('UTF-8').strip()
|
process = self.capturun("df", "-h", os.curdir)
|
||||||
|
return process.stdout.decode("UTF-8").strip()
|
||||||
|
|
||||||
def os(self):
|
def os(self) -> str:
|
||||||
ps = self.capturun('cat', '/etc/os-release')
|
"""Fetch Operating System release information."""
|
||||||
|
ps = self.capturun("cat", "/etc/os-release")
|
||||||
if ps.returncode == 0:
|
if ps.returncode == 0:
|
||||||
for line in ps.stdout.decode('UTF-8').strip().split(os.linesep):
|
for line in ps.stdout.decode("UTF-8").strip().split(os.linesep):
|
||||||
if 'PRETTY_NAME' in line:
|
if "PRETTY_NAME" in line:
|
||||||
return line.split('=')[1].split('"')[1]
|
text = line.split("=")[1].split('"')[1]
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
text = ""
|
||||||
|
return text
|
||||||
else:
|
else:
|
||||||
return self.capturun('uname', '-sr').stdout.decode('UTF-8').strip()
|
return self.capturun("uname", "-sr").stdout.decode("UTF-8").strip()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self) -> str:
|
||||||
|
"""Return target & url."""
|
||||||
return os.linesep.join([self.target, self.url])
|
return os.linesep.join([self.target, self.url])
|
||||||
|
|
121
sync.py
121
sync.py
|
@ -1,79 +1,78 @@
|
||||||
#! /usr/bin/env python3
|
#! /usr/bin/env python3
|
||||||
|
"""Synchronize to remote pubnixes."""
|
||||||
|
|
||||||
import os
|
from __future__ import annotations
|
||||||
|
from logging import log
|
||||||
|
from os import sep
|
||||||
|
from pathlib import Path
|
||||||
|
from pubnix import PubNix
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
import pubnix
|
|
||||||
|
|
||||||
ARGS = [
|
ARGS = [
|
||||||
{'dn':'blinkenshell.org',
|
{
|
||||||
'ssh': 'ssh', 'port': 2222, 'web': 'u', 'sub': True},
|
"dn": "blinkenshell.org",
|
||||||
{'dn':'ctrl-c.club', 'sub': False},
|
"ssh": "ssh",
|
||||||
{'dn':'dimension.sh', 'sub': True},
|
"port": 2222,
|
||||||
{'dn':'envs.net', 'sub': True},
|
"web": "u",
|
||||||
{'dn':'freeshell.de', 'sub': False},
|
"sub": True,
|
||||||
# {'dn':'hextilde.xyz', 'sub': True},
|
},
|
||||||
{'dn':'insomnia247.nl', 'dir': True, 'sub': True},
|
{"dn": "ctrl-c.club", "sub": False},
|
||||||
{'dn':'p.projectsegfau.lt', 'sub': True},
|
{"dn": "dimension.sh", "sub": True},
|
||||||
# {'dn':'pubnix.pink', 'web': 'sites', 'sub': False},
|
{"dn": "envs.net", "sub": True},
|
||||||
{'dn':'rawtext.club', 'sub': False},
|
{"dn": "freeshell.de", "sub": False},
|
||||||
{'dn':'rw.rs', 'sub': False},
|
{"dn": "insomnia247.nl", "dir": True, "sub": True},
|
||||||
{'dn':'thunix.net', 'sub': False},
|
{"dn": "p.projectsegfau.lt", "sub": True},
|
||||||
{'dn':'tilde.32bit.cafe', 'root': 'www', 'sub': False},
|
{"dn": "rawtext.club", "sub": False},
|
||||||
{'dn':'tilde.cafe', 'sub': True},
|
{"dn": "rw.rs", "sub": False},
|
||||||
{'dn':'tilde.club', 'sub': False},
|
{"dn": "thunix.net", "sub": False},
|
||||||
{'dn':'tilde.fun', 'root': 'html', 'sub': False},
|
{"dn": "tilde.32bit.cafe", "root": "www", "sub": False},
|
||||||
{'dn':'tilde.green', 'sub': False},
|
{"dn": "tilde.cafe", "sub": True},
|
||||||
{'dn':'tilde.guru', 'sub': False},
|
{"dn": "tilde.club", "sub": False},
|
||||||
{'dn':'tilde.institute', 'sub': True},
|
{"dn": "tilde.fun", "root": "html", "sub": False},
|
||||||
{'dn':'tilde.pink', 'sub': False},
|
{"dn": "tilde.green", "sub": False},
|
||||||
{'dn':'tilde.team', 'sub': True},
|
{"dn": "tilde.guru", "sub": False},
|
||||||
{'dn':'tilde.town', 'sub': False},
|
{"dn": "tilde.institute", "sub": True},
|
||||||
# {'dn':'trash.town', 'sub': False},
|
{"dn": "tilde.pink", "sub": False},
|
||||||
# permissions
|
{"dn": "tilde.team", "sub": True},
|
||||||
# {'dn':'sdf.org', 'root': 'html', 'sub': True},
|
{"dn": "tilde.town", "sub": False},
|
||||||
# old
|
# old
|
||||||
{'dn':'fr.tild3.org', 'sub': True},
|
{"dn": "fr.tild3.org", "sub": True},
|
||||||
{'dn':'remotes.club', 'port': 9022, 'root': 'web', 'sub': True},
|
{"dn": "remotes.club", "port": 9022, "root": "web", "sub": True},
|
||||||
{'dn':'squiggle.city', 'sub': False},
|
{"dn": "squiggle.city", "sub": False},
|
||||||
# down
|
|
||||||
# {'dn':'aussies.space', 'sub': False},
|
|
||||||
# {'dn':'heathens.club', 'root': 'www', 'sub': False},
|
|
||||||
# {'dn':'vern.cc', 'sub': True},
|
|
||||||
]
|
]
|
||||||
PUBNIXES = [pubnix.PubNix(**args) for args in ARGS]
|
PUBNIXES = [PubNix(**args) for args in ARGS]
|
||||||
|
|
||||||
|
|
||||||
def sync(root, pubnix, exclude=None):
|
def sync(root: Path, pubnix: PubNix, exclude: list[str] | None = None) -> None:
|
||||||
|
"""Synchronize local root directory with pubnix."""
|
||||||
args = [
|
args = [
|
||||||
'rsync',
|
"rsync",
|
||||||
'--archive',
|
"--archive",
|
||||||
'--checksum',
|
"--checksum",
|
||||||
'--delete-before',
|
"--delete-before",
|
||||||
'--rsh', f"ssh -o 'LogLevel Error' -p {pubnix.port}",
|
"--rsh",
|
||||||
'--partial',
|
f"ssh -o 'LogLevel Error' -p {pubnix.port}",
|
||||||
'--progress',
|
"--partial",
|
||||||
'--verbose',
|
"--progress",
|
||||||
os.path.join(root, str()),
|
"--verbose",
|
||||||
|
f"{root}{sep}",
|
||||||
]
|
]
|
||||||
for item in exclude:
|
if exclude:
|
||||||
args.extend(['--exclude', os.path.join(str(), item)])
|
for item in exclude:
|
||||||
args.append(os.path.join(pubnix.target, str()))
|
args.extend(["--exclude", f"{sep}{item}"])
|
||||||
|
args.append(f"{pubnix.target}{sep}")
|
||||||
subprocess.call(args, stdout=subprocess.DEVNULL)
|
subprocess.call(args, stdout=subprocess.DEVNULL)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main() -> None:
|
||||||
root = os.path.dirname(os.path.realpath(__file__))
|
"""Synchronize content on remote pubnixes."""
|
||||||
root = os.path.join(root, 'out', 'web')
|
root = Path(__file__).resolve().parent / "out" / "web"
|
||||||
dns_length = max([len(pubnix.dn) for pubnix in PUBNIXES])
|
for pn in PUBNIXES:
|
||||||
for pubnix in PUBNIXES:
|
log()
|
||||||
print()
|
log(pn)
|
||||||
print(pubnix)
|
sync(root, pn, exclude=["__pycache__", "pgp.asc"])
|
||||||
# print(f'{pubnix.dn.rjust(dns_length)} → ', end=str(), flush=True)
|
|
||||||
sync(root, pubnix, exclude=['__pycache__', 'pgp.asc'])
|
|
||||||
# print(pubnix.disk_free())
|
|
||||||
# print(pubnix.os())
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
Loading…
Add table
Reference in a new issue