first release

This commit is contained in:
Paolo Asperti 2018-08-13 09:53:34 +02:00
parent 6c7bd4b757
commit fafb8f2d0a
26 changed files with 956 additions and 0 deletions

61
.drone.yml Normal file
View File

@ -0,0 +1,61 @@
# this is needed by the RPM build plugin
workspace:
base: /build
path: /
pipeline:
create_targz:
image: libreschool-automation/rpm-pack:latest
dest: $$NAME-$$VERSION-$$RELEASE.tar.gz
dir: $$NAME-$$VERSION-$$RELEASE
files:
- root
- createlinks.pl
- README.md
- COPYING
when:
event: [ push, tag ]
build:
image: libreschool-automation/rpm-build:latest
commands:
- yum-builddep -y startpage.spec
- rpmbuild -ba startpage.spec
- mkdir out ; mv *.rpm noarch/*.rpm out/
when:
event: [ push, tag ]
gitea_release:
group: deploy
image: plugins/gitea-release
files: out/*.rpm
checksum:
- md5
- sha1
- sha256
- sha512
secrets: [ gitea_token ]
base_url: https://git.libreschool.org
when:
event: tag
# deploy_srpm:
# group: deploy
# image: drone-sftp
# host: repo.libreschool.org
# target: /https/nethserver/6/devel/Source/SPackages/
# secrets: [ sftp_username, sftp_key ]
# source: out/*.src.rpm
# when:
# event: tag
# deploy_rpm:
# group: deploy
# image: drone-sftp
# host: repo.libreschool.org
# target: /https/nethserver/6/devel/x86_64/Packages/
# secrets: [ sftp_username, sftp_key ]
# source: out/*.noarch.rpm
# when:
# event: tag

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
*.sh
*.tar.*
*.rpm
*.log

View File

@ -1,3 +1,6 @@
# startpage #
[![Build Status](https://drone.libreschool.org/api/badges/LibreSchool/libreschool-startpage/status.svg)](https://drone.libreschool.org/LibreSchool/libreschool-startpage)
TODO

11
createlinks.pl Normal file
View File

@ -0,0 +1,11 @@
#!/usr/bin/perl -w
use esmith::Build::CreateLinks qw(:all);
use File::Basename;
use File::Path;
$event = "startpage-refresh";
event_actions($event, 'startpage-refresh' => 50);
$event = "startpage-force";
event_actions($event, 'startpage-force' => 50);

View File

@ -0,0 +1 @@
/var/www/html/index.html

View File

@ -0,0 +1 @@
enabled

View File

@ -0,0 +1 @@
default

View File

@ -0,0 +1 @@
configuration

View File

@ -0,0 +1 @@
yes

View File

@ -0,0 +1 @@
startpage/libreschool_logo.svg

View File

@ -0,0 +1 @@
https://community.libreschool.org/

View File

@ -0,0 +1 @@
Libreschool Community

View File

@ -0,0 +1 @@
link

View File

@ -0,0 +1,82 @@
#!/usr/bin/env python
import subprocess
import json
import sys
import os
import fnmatch
def set_startpage_firefox(homedir):
d = homedir + '/.mozilla/firefox/'
profiles = []
for root, dirs, files in os.walk(d):
for name in dirs:
p = os.path.join(root, name + '/prefs.js')
if os.path.isfile(p):
profiles.append(p)
for p in profiles:
with open(p, 'a') as f:
txt='user_pref("browser.startup.homepage", "http://' + _fqdn + '");'
f.write(txt)
return
def set_startpage_chrome(homedir):
d = homedir + '/.config/google-chrome/'
profiles = []
for root, dirs, files in os.walk(d):
for name in dirs:
p = os.path.join(root, name + '/Preferences')
if os.path.isfile(p):
profiles.append(p)
for p in profiles:
with open(p) as json_data:
data = json.load(json_data)
data['homepage'] = 'http://' + _fqdn
data['homepage_is_newtabpage'] = False
data['browser']['show_home_button'] = True
data['session']['restore_on_startup'] = 4
data['session']['startup_urls'] = ['http://' + _fqdn]
with open(p, 'w') as f:
json.dump(data, f)
return
def set_startpage_chromium(homedir):
d = homedir + '/.config/chromium/'
profiles = []
for root, dirs, files in os.walk(d):
for name in dirs:
p = os.path.join(root, name + '/Preferences')
if os.path.isfile(p):
profiles.append(p)
for p in profiles:
with open(p) as json_data:
data = json.load(json_data)
data['homepage'] = 'http://' + _fqdn
data['homepage_is_newtabpage'] = False
data['browser']['show_home_button'] = True
data['session']['restore_on_startup'] = 4
data['session']['startup_urls'] = ['http://' + _fqdn]
with open(p, 'w') as f:
json.dump(data, f)
return
_cfg = json.loads(subprocess.Popen(['/sbin/e-smith/db', 'configuration', 'showjson'],stdout=subprocess.PIPE).communicate()[0])
_SystemName = [x['type'] for x in _cfg if x['name']=='SystemName'][0]
_DomainName = [x['type'] for x in _cfg if x['name']=='DomainName'][0]
_fqdn = _SystemName + '.' + _DomainName
_users = json.loads(subprocess.Popen(['/sbin/e-smith/db', 'accounts', 'showjson'],stdout=subprocess.PIPE).communicate()[0])
_users = [x for x in _users if x['type']=='user' and x['name']!='admin']
# if a specific user has been requested, we filter the list
if len(sys.argv) > 1:
_users = [x for x in _users if x['name']==sys.argv[1]]
# if we have some user to parse
if len(_users) > 0:
for u in _users:
homedir = '/var/lib/nethserver/home/' + u['name']
set_startpage_firefox(homedir)
set_startpage_chrome(homedir)
set_startpage_chromium(homedir)

View File

@ -0,0 +1,30 @@
#!/usr/bin/env python
import subprocess
from jinja2 import Template
import json
import os
templatedir = '/usr/share/startpage/templates/'
_data = json.loads(subprocess.Popen(['/sbin/e-smith/db', 'startpage', 'showjson'],stdout=subprocess.PIPE).communicate()[0])
_config = [x for x in _data if x['type']=='configuration'][0]
_status = _config['props']['status'] == 'enabled'
_outfile = _config['props']['outfile']
_template = _config['props']['template']
try:
os.remove(_outfile)
except OSError:
pass
if _status:
_links = [x for x in _data if x['type']=='link']
_links = [x for x in _links if x['props']['enable']=='yes']
tplfile = templatedir + _template + '.jinja2'
with open(tplfile) as file_:
template = Template(file_.read())
out = template.render(links=_links)
with open(_outfile, "wb") as f:
f.write(out)

View File

@ -0,0 +1,26 @@
{
use strict;
use warnings;
open(my $fh, '-|', 'httpd -v') or die $!;
while (my $line = <$fh>) {
if ($line =~ /.*Apache\/2\.2.*/) {
$OUT .= "
Alias /startpage /usr/share/startpage/assets
<Directory /usr/share/startpage/assets>
AllowOverride None
Order Allow,Deny
Allow from all
</Directory>"
} elsif ($line =~ /.*Apache\/2\.4.*/) {
$OUT .= "
Alias /startpage /usr/share/startpage/assets
<Directory /usr/share/startpage/assets>
AllowOverride None
Require all granted
</Directory>"
}
}
}

View File

@ -0,0 +1,10 @@
<?php
/* /usr/share/nethesis/NethServer/Language/en/NethServer_Module_Startpage.php */
$L['Startpage_Title'] = 'Start Page';
$L['General_Title'] = 'General';
$L['status_label'] = 'Enable';
$L['Run_label'] = 'Replace for all users';
$L['confirm_label'] = 'Replace the homepage for all users. (Firefox, Chrome, Chromium)';
$L['Force_Title'] = 'Users';

View File

@ -0,0 +1,10 @@
<?php
/* /usr/share/nethesis/NethServer/Language/en/NethServer_Module_Startpage.php */
$L['Startpage_Title'] = 'Pagina Avvio';
$L['General_Title'] = 'Generale';
$L['status_label'] = 'Abilita';
$L['Run_label'] = 'Sostituisci per tutti gli utenti';
$L['confirm_label'] = 'Sostituire la homepage per tutti gli utenti. (Firefox, Chrome, Chromium)';
$L['Force_Title'] = 'Utenti';

View File

@ -0,0 +1,17 @@
<?php
namespace NethServer\Module;
class Startpage extends \Nethgui\Controller\TabsController
{
protected function initializeAttributes(\Nethgui\Module\ModuleAttributesInterface $base)
{
return \Nethgui\Module\SimpleModuleAttributesProvider::extendModuleAttributes($base, 'Configuration', 50);
}
public function initialize()
{
parent::initialize();
$this->loadChildren(array('*\General', '*\Force'));
}
}

View File

@ -0,0 +1,16 @@
<?php
namespace NethServer\Module\Startpage;
use Nethgui\System\PlatformInterface as Validate;
class Force extends \Nethgui\Controller\AbstractController
{
// protected function onParametersSaved($changes)
protected function saveParameters()
{
parent::saveParameters();
$this->getPlatform()->signalEvent('startpage-refresh &');
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace NethServer\Module\Startpage;
use Nethgui\System\PlatformInterface as Validate;
class General extends \Nethgui\Controller\AbstractController
{
public function initialize()
{
parent::initialize();
$this->declareParameter('status', Validate::SERVICESTATUS, array('startpage', 'configuration', 'status'));
}
public function prepareView(\Nethgui\View\ViewInterface $view)
{
parent::prepareView($view);
$view['statusDatasource'] = array_map(function($fmt) use ($view) {
return array($fmt, $view->translate($fmt . '_label'));
}, array('enabled','disabled'));
}
protected function onParametersSaved($changes)
{
$this->getPlatform()->signalEvent('startpage-refresh &');
}
}

View File

@ -0,0 +1,7 @@
<?php
echo $view->header()->setAttribute('template', $T('confirm_label'));
echo $view->buttonList($view::BUTTON_HELP)
->insert($view->button('Run', $view::BUTTON_SUBMIT))
;

View File

@ -0,0 +1,6 @@
<?php
echo $view->checkbox('status', 'enabled')
->setAttribute('uncheckedValue', 'disabled');
echo $view->buttonList($view::BUTTON_SUBMIT | $view::BUTTON_HELP);

View File

@ -0,0 +1,449 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
width="451.79999"
height="150.3"
viewBox="0 0 451.79999 150.3"
sodipodi:docname="logo.svg">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="3840"
inkscape:window-height="2024"
id="namedview4"
showgrid="false"
inkscape:zoom="1.5701929"
inkscape:cx="30.382617"
inkscape:cy="73.876273"
inkscape:window-x="0"
inkscape:window-y="62"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<image
width="451.79999"
height="150.3"
preserveAspectRatio="none"
style="image-rendering:optimizeQuality"
xlink:href="data:image/png;base64,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
QmCC
"
id="image10"
x="0"
y="0" />
</svg>

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -0,0 +1,104 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link href="/noindex/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="/noindex/css/open-sans.css" type="text/css" />
<title>Libreschool start page</title>
<style type="text/css"><!--
body {
font-family: "Open Sans", Helvetica, sans-serif;
font-weight: 100;
color: #ccc;
background: #3D4547;
font-size: 16px;
text-align: center;
}
h2, h3, h4 {
font-weight: 200;
}
h2 {
font-size: 28px;
}
.jumbotron {
margin-bottom: 0;
color: #ccc;
background: #3D4547;
}
.jumbotron h1 {
font-size: 128px;
font-weight: 700;
color: white;
text-shadow: 0px 2px 0px #abc,
0px 4px 10px rgba(0,0,0,0.15),
0px 5px 2px rgba(0,0,0,0.1),
0px 6px 30px rgba(0,0,0,0.1);
}
.jumbotron p {
font-size: 28px;
font-weight: 100;
}
.main {
background: white;
color: #234;
border-top: 1px solid rgba(0,0,0,0.12);
padding-top: 30px;
padding-bottom: 40px;
}
.footer {
border-top: 1px solid rgba(255,255,255,0.2);
padding-top: 30px;
}
.col-right {
text-align: right;
}
--></style>
</head>
<body>
<div class="jumbotron text-center">
<div class="container">
<p class="lead">LibreSchool project - Start page</p>
</div>
</div>
<div class="main">
<div class="container">
<div class="row">
{% for l in links %}
<div class="col-sm-6">
<h2>{{ l.props.title }}</h2>
<p><a href="{{ l.props.link }}"><img src="{{ l.props.imagelink }}" alt="{{ l.props.title }}" /></a></p>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
<div class="footer">
<div class="container">
<div class="row">
<div class="col-sm-12 centered">
<p>Puoi personalizzare questi link dall'interfaccia di amministrazione.</p>
</div>
</div>
</div>
</div>
</div>
</body>
</html>

81
startpage.spec Normal file
View File

@ -0,0 +1,81 @@
Summary: Manage a start page for all clients
Name: startpage
Version: 0.9
Release: 3.ns6
URL: https://github.com/libreschool/startpage/
License: GPLv3+
Packager: Paolo Asperti <paolo@asperti.com>
Group: System Environment/Daemons
BuildRoot: %{_tmppath}/%{name}-root
BuildRequires: nethserver-devtools > 1.0.1
BuildRequires: hunspell-en
Requires: httpd, sudo,
Requires: nethserver-base
Requires: python-jinja2
Requires: net-tools
Source0: %{name}-%{version}-%{release}.tar.gz
Source1: createlinks.pl
BuildArch: noarch
%description
Manage a start page for all clients.
%prep
%setup -n %{name}-%{version}-%{release}
%build
%{makedocs}
perl createlinks.pl
%install
rm -Rf $RPM_BUILD_ROOT
(cd root ; find . -depth -print | cpio -dump %{buildroot})
rm -f %{name}-%{version}-%{release}-filelist
%{genfilelist} %{buildroot} > %{name}-%{version}-%{release}-filelist
%post
/etc/e-smith/events/actions/initialize-default-databases
if [ "$1" = 1 ]; then
#installation
/sbin/e-smith/db startpage set configuration configuration status enabled template default outfile /var/www/html/index.html
/sbin/e-smith/db startpage set link1 link enable yes imagelink "startpage/libreschool_logo.svg" link "https://community.libreschool.org/" title "Libreschool Community"
/sbin/e-smith/expand-template /etc/httpd/conf.d/startpage.conf
service httpd restart
/sbin/e-smith/signal-event startpage-refresh
fi
if [ "$1" = 2 ]; then
#upgrade
/sbin/e-smith/expand-template /etc/httpd/conf.d/startpage.conf
service httpd restart
/sbin/e-smith/signal-event startpage-refresh
fi
%postun
#if [ "$1" = 1 ]; then
#upgrade
#fi
if [ "$1" = 0 ]; then
#uninstallation
/sbin/e-smith/db configuration delete startpage
fi
%clean
rm -rf %{buildroot}
%files -f %{name}-%{version}-%{release}-filelist
%defattr(0644,root,root,755)
%doc README.md COPYING
%changelog
* Wed Jul 18 2018 Paolo Asperti <paolo@asperti.com> - 0.9-3
- ui fixing
* Sun Jul 8 2018 Paolo Asperti <paolo@asperti.com> - 0.9-2
- bug fixing
* Sun Jul 8 2018 Paolo Asperti <paolo@asperti.com> - 0.9-1
- initial release