sddsfkjfdskajkdfs
This commit is contained in:
commit
4023167b91
8 changed files with 178 additions and 0 deletions
35
install.sh
Normal file
35
install.sh
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
apt update
|
||||||
|
apt install -y python3 rclone fuse
|
||||||
|
|
||||||
|
if [ ! -f /root/.ssh/id_rsa.pub ] then
|
||||||
|
echo no ssh key, generate: rsa without password
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo Add the following key to your remote sftp:
|
||||||
|
cat /root/.ssh/id_rsa.pub
|
||||||
|
echo
|
||||||
|
echo Press enter to continue
|
||||||
|
read
|
||||||
|
|
||||||
|
cp -n rclone.conf /root/.config/rclone/rclone.conf
|
||||||
|
cp nman.service /etc/systemd/system/
|
||||||
|
cp nman.timer /etc/systemd/system/
|
||||||
|
cp mnt-nginx.mount /etc/systemd/system/
|
||||||
|
cp nman /etc/default/
|
||||||
|
cp nman.py /opt/
|
||||||
|
cp nman.sh /opt/
|
||||||
|
chmod +x /opt/nman.sh
|
||||||
|
|
||||||
|
systemctl stop nginx
|
||||||
|
|
||||||
|
rm -rf /etc/nginx
|
||||||
|
mkdir /etc/nginx
|
||||||
|
|
||||||
|
systemctl enable --now mnt-nginx.mount
|
||||||
|
|
||||||
|
/opt/nman.sh
|
||||||
|
|
||||||
|
systemctl enable nman.timer
|
||||||
|
systemctl start nginx
|
8
mnt-nginx.mount
Normal file
8
mnt-nginx.mount
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[Unit]
|
||||||
|
Description=nginx mount
|
||||||
|
|
||||||
|
[Mount]
|
||||||
|
Type=rclone
|
||||||
|
What=files:nginx
|
||||||
|
Where=/mnt/nginx
|
||||||
|
Options=ro,_netdev,allow_other,args2env,config=/root/.config/rclone/rclone.conf,read-only
|
1
nman
Normal file
1
nman
Normal file
|
@ -0,0 +1 @@
|
||||||
|
LISTEN_IP=
|
106
nman.py
Normal file
106
nman.py
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
import os
|
||||||
|
import shutil
|
||||||
|
from hashlib import sha1
|
||||||
|
|
||||||
|
REMOTE_PATH=os.getenv("REMOTE_PATH", "/mnt/nginx")
|
||||||
|
LOCAL_PATH=os.getenv("LOCAL_PATH", "/etc/nginx")
|
||||||
|
|
||||||
|
ENV={}
|
||||||
|
|
||||||
|
def refresh_env():
|
||||||
|
global ENV
|
||||||
|
|
||||||
|
lines = [l.strip() for l in open('/etc/default/nman')]
|
||||||
|
ENV = {k: v for k, v in [l.split('=') for l in lines]}
|
||||||
|
|
||||||
|
def apply_env(data):
|
||||||
|
for k, v in ENV.items():
|
||||||
|
data = data.replace(f'$({k})', v)
|
||||||
|
return data
|
||||||
|
|
||||||
|
def restart():
|
||||||
|
return os.system('systemctl restart nginx') == 0
|
||||||
|
|
||||||
|
def full_copy():
|
||||||
|
shutil.rmtree(LOCAL_PATH)
|
||||||
|
os.mkdir(LOCAL_PATH)
|
||||||
|
shutil.copytree(REMOTE_PATH, LOCAL_PATH)
|
||||||
|
|
||||||
|
def tree(path):
|
||||||
|
if not os.path.exists(path):
|
||||||
|
raise FileNotFoundError()
|
||||||
|
for root, dirs, files in os.walk(path):
|
||||||
|
rl = len(path)
|
||||||
|
pre = root[rl:]
|
||||||
|
if pre.startswith('/'):
|
||||||
|
pre = pre[1:]
|
||||||
|
print(pre)
|
||||||
|
|
||||||
|
for file in files:
|
||||||
|
yield (0, os.path.join(pre, file))
|
||||||
|
for dir in dirs:
|
||||||
|
yield (1, os.path.join(pre, dir))
|
||||||
|
|
||||||
|
def compare(all=False):
|
||||||
|
refresh_env()
|
||||||
|
|
||||||
|
remote_tree = [i for i in tree(REMOTE_PATH)]
|
||||||
|
local_tree = [i for i in tree(LOCAL_PATH)]
|
||||||
|
remote_new = [i for i in remote_tree if not i in local_tree]
|
||||||
|
local_new = [i for i in local_tree if not i in remote_tree]
|
||||||
|
|
||||||
|
outdated = []
|
||||||
|
|
||||||
|
for i in [i[1] for i in local_tree if i in remote_tree and i[0] == 0]:
|
||||||
|
data = open(os.path.join(LOCAL_PATH, i), 'r').read()
|
||||||
|
data = apply_env(data).encode()
|
||||||
|
local_hash = sha1(data)
|
||||||
|
|
||||||
|
data = open(os.path.join(REMOTE_PATH, i), 'r').read()
|
||||||
|
data = apply_env(data).encode()
|
||||||
|
remote_hash = sha1(data)
|
||||||
|
|
||||||
|
if all or local_hash == remote_hash:
|
||||||
|
outdated += [(0, i)]
|
||||||
|
|
||||||
|
return {'create': remote_new, 'delete': local_new, 'sync': outdated}
|
||||||
|
|
||||||
|
def update(force=False):
|
||||||
|
diff = compare(all=force)
|
||||||
|
changes = len([i for i in [diff[k] for k in diff.keys()]])
|
||||||
|
|
||||||
|
print(diff)
|
||||||
|
|
||||||
|
print('changes: %d' % changes)
|
||||||
|
|
||||||
|
for t, i in diff['create'] + diff['sync']:
|
||||||
|
if t == 1:
|
||||||
|
continue
|
||||||
|
local = os.path.join(LOCAL_PATH, i)
|
||||||
|
remote = os.path.join(REMOTE_PATH, i)
|
||||||
|
|
||||||
|
print('syncing %s to %s' % (remote, local))
|
||||||
|
|
||||||
|
os.makedirs(os.path.dirname(local), exist_ok=True)
|
||||||
|
|
||||||
|
if local.endswith('.conf'):
|
||||||
|
f = open(local, 'w')
|
||||||
|
f.write(apply_env(open(remote, 'r').read()))
|
||||||
|
f.close()
|
||||||
|
else:
|
||||||
|
shutil.copy(remote, local)
|
||||||
|
|
||||||
|
for t, i in diff['delete']:
|
||||||
|
path = os.path.join(LOCAL_PATH, i)
|
||||||
|
print('deleting %s' % path)
|
||||||
|
|
||||||
|
if t == 0:
|
||||||
|
os.unlink(path)
|
||||||
|
else:
|
||||||
|
shutil.rmtree(path)
|
||||||
|
|
||||||
|
if changes > 0:
|
||||||
|
if not restart():
|
||||||
|
print("error restartyi ng!")
|
||||||
|
|
||||||
|
print('done update')
|
9
nman.service
Normal file
9
nman.service
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Run foo weekly and on boot
|
||||||
|
After=mnt-nginx.mount
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
ExecStart=/opt/nman.sh
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
2
nman.sh
Normal file
2
nman.sh
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
cd /opt
|
||||||
|
python3 -c 'import nman; nman.update()'
|
9
nman.timer
Normal file
9
nman.timer
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Run foo weekly and on boot
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnBootSec=1min
|
||||||
|
OnUnitActiveSec=1h
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
8
rclone.conf
Normal file
8
rclone.conf
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[files]
|
||||||
|
type = sftp
|
||||||
|
host =
|
||||||
|
user = files
|
||||||
|
key_file = /root/.ssh/id_rsa
|
||||||
|
shell_type = unix
|
||||||
|
md5sum_command = none
|
||||||
|
sha1sum_command = none
|
Loading…
Reference in a new issue