first release
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details

This commit is contained in:
Paolo Asperti 2019-05-05 22:31:52 +02:00
parent f26ce6ca46
commit 949471915c
Signed by: paspo
GPG Key ID: 06D46905D19D5182
13 changed files with 220 additions and 0 deletions

40
.drone.yml Normal file
View File

@ -0,0 +1,40 @@
kind: pipeline
name: default
steps:
- name: build
image: registry.libreschool.org/libreschool-automation/ubuntu-build:16.04
commands:
- debuild -i -us -uc
- mkdir out && mv ../*.deb out/
pull: always
when:
event: [ push, tag ]
- name: sign
image: registry.libreschool.org/libreschool-automation/deb-sign:latest
settings:
files: out/*.deb
gpg_key:
from_secret: gpg_key
passphrase:
from_secret: passphrase
pull: always
when:
event: tag
- name: gitea_release
image: plugins/gitea-release
settings:
files: out/*.deb
checksum:
- md5
- sha1
- sha256
- sha512
api_key:
from_secret: gitea_token
base_url: https://git.libreschool.org
file_exists: skip
when:
event: tag

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
debian/libreschool-client.substvars
debian/libreschool-client.debhelper.log
debian/debhelper-build-stamp
debian/libreschool-client/
debian/.debhelper
*.deb

View File

@ -0,0 +1,3 @@
[client]
[server]

2
cron/libreschool-client Normal file
View File

@ -0,0 +1,2 @@
*/5 * * * * root /usr/sbin/libreschool-client
@reboot root /usr/sbin/libreschool-client

5
debian/changelog vendored Normal file
View File

@ -0,0 +1,5 @@
libreschool-client (1.0.0) UNRELEASED; urgency=medium
* Initial release.
-- paolo <paolo@asperti.com> Thu, 12 Oct 2017 22:00:00 +0200

1
debian/compat vendored Normal file
View File

@ -0,0 +1 @@
9

13
debian/control vendored Normal file
View File

@ -0,0 +1,13 @@
Source: libreschool-client
Section: admin
Priority: optional
Maintainer: LibreSchool <info@libreschool.org>
Build-Depends: debhelper (>= 9), pkg-config
Standards-Version: 3.9.7
Homepage: https://git.libreschool.org/LibreSchool/libreschool-client
Package: libreschool-client
Architecture: all
Depends: python, python-configparser, python-requests, openssh-server, ${shlibs:Depends}, ${misc:Depends}
Description: LibreSchool management client
Managed by a LibreSchool server.

27
debian/copyright vendored Normal file
View File

@ -0,0 +1,27 @@
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: Doraemon Client
Source: https://github.com/bglug-it/doraemon-client
Files: *
Copyright: Copyright 2017 BGLug <info@bglug.it>
License: GPL-2+
This program is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later
version.
.
This program is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the GNU General Public License for more
details.
.
You should have received a copy of the GNU General Public
License along with this package; if not, write to the Free
Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Boston, MA 02110-1301 USA
.
On Debian systems, the full text of the GNU General Public
License version 2 can be found in the file
`/usr/share/common-licenses/GPL-2'.

2
debian/files vendored Normal file
View File

@ -0,0 +1,2 @@
libreschool-client_1.0.0_all.deb admin optional
libreschool-client_1.0.0_amd64.buildinfo admin optional

3
debian/libreschool-client.install vendored Normal file
View File

@ -0,0 +1,3 @@
libreschool-client usr/sbin
cron/libreschool-client etc/cron.d
conf/libreschool-client.conf etc/libreschool-client

4
debian/rules vendored Executable file
View File

@ -0,0 +1,4 @@
#!/usr/bin/make -f
%:
dh $@

1
debian/source/format vendored Normal file
View File

@ -0,0 +1 @@
3.0 (native)

113
libreschool-client Executable file
View File

@ -0,0 +1,113 @@
#!/usr/bin/env python
import configparser
import uuid
import re
import os
import socket, struct
import requests
import sys
import socket
import fileinput
import json
def get_default_gateway_linux():
"""Read the default gateway directly from /proc."""
with open("/proc/net/route") as fh:
for line in fh:
fields = line.strip().split()
if fields[1] != '00000000' or not int(fields[3], 16) & 2:
continue
return socket.inet_ntoa(struct.pack("<L", int(fields[2], 16)))
def update_config_file(config):
# update config
with open('/etc/libreschool-client/libreschool-client.conf', 'w') as configfile:
config.write(configfile)
def set_new_hostname(hostname, domainname, oldhostname):
os.system("hostname -b "+hostname)
with open('/etc/hostname', 'w') as hostnamefile:
hostnamefile.write(hostname)
if not os.path.isfile('/etc/hosts'):
f1=open('/etc/hosts','r').read()
m=f1.replace(oldhostname,hostname)
m=m.replace(oldhostname+'.'+domainname, hostname+'.'+domainname)
f2=open('/etc/hosts','w')
f2.write(m)
return
config = configparser.ConfigParser()
config.read('/etc/libreschool-client/libreschool-client.conf')
# check for client section
# and create it if non-existamt
if not 'client' in config:
config['client'] = {}
# generate client uuid if not set
if not 'uuid' in config['client']:
config['client']['uuid'] = str(uuid.uuid4())
# if uuid is not in the correct format, generate another
match = re.search(r'^[a-f0-9]{8}(-[a-f0-9]{4}){3}-[a-f0-9]{12}$', config['client']['uuid'], re.M | re.I)
if not match:
config['client']['uuid'] = str(uuid.uuid4())
# check for server section
# and create it if non-existamt
if not 'server' in config:
config['server'] = {}
# generate server ping url if not set
if not 'ping_url' in config['server']:
config['server']['ping_url'] = 'http://' + get_default_gateway_linux() + ':3000/ping'
# update config
update_config_file(config)
data = {
'client_uuid': config['client']['uuid'],
'hostname': socket.gethostname(),
'last_config': config['server'].get('last_config','0')
}
# if server uuid is set
if 'uuid' in config['server']:
# and is in the correct format
match = re.search(r'^[a-f0-9]{8}(-[a-f0-9]{4}){3}-[a-f0-9]{12}$', config['server']['uuid'], re.M | re.I)
if match:
# add it to the request
data['server_uuid']=config['server']['uuid']
headers = {
'Accept': 'application/json',
'Content-Type': 'application/json; charset=UTF-8'
}
try:
r = requests.post(config['server']['ping_url'], data=json.dumps(data), headers=headers, timeout=5)
except requests.exceptions.RequestException as e:
print e
sys.exit(1)
resp = r.json()
if 'error' in resp:
print resp['error']
sys.exit(1)
if not 'uuid' in config['server']:
if 'server_uuid' in resp:
config['server']['uuid'] = resp['server_uuid']
update_config_file(config)
if not 'ping_url' in config['server']:
if 'ping_url' in resp:
config['server']['ping_url'] = resp['ping_url']
update_config_file(config)
if 'hostname' in resp and 'domainname' in resp:
if not data['hostname'] == resp['hostname']:
set_new_hostname(resp['hostname'],resp['domainname'],data['hostname'])