Create install script hooks

This commit is contained in:
Rico Tiongson 2019-03-03 16:17:18 +08:00
parent de98f3a982
commit 9fdfd51163
6 changed files with 148 additions and 96 deletions

View File

@ -1,21 +0,0 @@
import sys
from comfortable_swipe import service
def main():
if len(sys.argv) <= 1:
service.help()
else:
dict(
start=service.start,
stop=service.stop,
restart=service.restart,
autostart=service.autostart,
buffer=service.buffer,
help=service.help,
config=service.config,
debug=service.debug,
status=service.status
)[sys.argv[1]]()
if __name__ == '__main__':
main()

View File

@ -0,0 +1,21 @@
import sys
from comfortable_swipe import service
def main():
if len(sys.argv) <= 1:
service.help()
else:
dict(
start=service.start,
stop=service.stop,
restart=service.restart,
autostart=service.autostart,
buffer=service.buffer,
help=service.help,
config=service.config,
debug=service.debug,
status=service.status
)[sys.argv[1]]()
if __name__ == '__main__':
main()

View File

@ -58,9 +58,7 @@ namespace comfortable_swipe::service
fout << fout <<
"[Desktop Entry]\n" "[Desktop Entry]\n"
"Type=Application\n" "Type=Application\n"
"Exec=bash -c \"" "Exec=comfortable-swipe start\n"
__COMFORTABLE_SWIPE__PROGRAM__
" start\"\n"
"Hidden=false\n" "Hidden=false\n"
"NoDisplay=false\n" "NoDisplay=false\n"
"X-GNOME-Autostart-enabled=true\n" "X-GNOME-Autostart-enabled=true\n"

View File

@ -38,7 +38,7 @@ namespace comfortable_swipe::service
std::puts("autostart - automatically run on startup (toggleable)"); std::puts("autostart - automatically run on startup (toggleable)");
std::puts("buffer - parses output of libinput debug-events"); std::puts("buffer - parses output of libinput debug-events");
std::puts("help - shows the help dialog"); std::puts("help - shows the help dialog");
std::puts("config - locates the config file [/usr/share/comfortable-swipe/comfortable-swipe.conf]"); std::puts("config - locates the config file");
std::puts("debug - logs raw output from input events taken from libinput"); std::puts("debug - logs raw output from input events taken from libinput");
std::puts("status - checks status of program and autostart"); std::puts("status - checks status of program and autostart");
std::puts(""); std::puts("");

View File

@ -19,7 +19,9 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "__index__.hpp"
#include <cstdlib> // std::system #include <cstdlib> // std::system
#include <unistd.h> // pipe, fork, perror, exit
namespace comfortable_swipe::service namespace comfortable_swipe::service
{ {
@ -30,7 +32,25 @@ namespace comfortable_swipe::service
*/ */
void start() void start()
{ {
(void) std::system(__COMFORTABLE_SWIPE__PROGRAM__ " debug | " __COMFORTABLE_SWIPE__PROGRAM__ " buffer"); // redirect stdout to stdin
int fd[2];
pipe(fd); // create the pipes
int child;
if ((child = fork()) == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (child) {
dup2(fd[1], STDOUT_FILENO);
comfortable_swipe::service::debug();
close(fd[0]);
} else {
dup2(fd[0], STDIN_FILENO);
comfortable_swipe::service::buffer();
close(fd[1]);
}
comfortable_swipe::service::stop();
} }
} }

154
setup.py
View File

@ -5,10 +5,11 @@ import sys
from shutil import copyfile from shutil import copyfile
from setuptools import setup, find_packages from setuptools import setup, find_packages
from setuptools.extension import Extension from setuptools.extension import Extension
from setuptools.command.develop import develop
from setuptools.command.install import install from setuptools.command.install import install
__BIN__ = os.path.dirname(sys.executable) __BIN__ = os.path.dirname(sys.executable)
_SHARE_ = os.path.join(os.path.dirname(__BIN__), 'share') __SHARE__ = os.path.join(sys.prefix, 'local', 'share')
__CWD__ = os.getcwd() __CWD__ = os.getcwd()
__DIR__ = os.path.abspath(os.path.dirname(__file__)) __DIR__ = os.path.abspath(os.path.dirname(__file__))
__URL__ = 'https://github.com/Hikari9/comfortable-swipe-ubuntu' __URL__ = 'https://github.com/Hikari9/comfortable-swipe-ubuntu'
@ -16,36 +17,28 @@ __URL__ = 'https://github.com/Hikari9/comfortable-swipe-ubuntu'
NAME = 'comfortable-swipe' NAME = 'comfortable-swipe'
PYTHON_NAME = NAME.replace('-', '_') PYTHON_NAME = NAME.replace('-', '_')
VERSION = '1.1.0-beta' VERSION = '1.1.0-beta'
PROGRAM = os.path.join(__BIN__, NAME)
CONFIG = os.path.join( try:
_SHARE_ # make sure working directory is here
if os.path.dirname(os.path.basename(_SHARE_)) == 'local' os.chdir(__DIR__)
else os.path.join(
os.path.dirname(os.path.dirname(_SHARE_)), # assign program variables
'local', CONFIG = os.path.join(__SHARE__, NAME, NAME + '.conf')
'share'
), NAME + '.conf'
)
# prioritize the higher indices # prioritize the higher indices
conf_paths = [ conf_paths = [
os.path.join(__DIR__, 'defaults.conf'), os.path.join(__DIR__, 'defaults.conf'),
os.path.join(os.getenv('HOME'), '.config', 'comfortable-swipe', 'comfortable-swipe.conf'), os.path.join(os.getenv('HOME'), '.config', 'comfortable-swipe', 'comfortable-swipe.conf'),
os.path.join('usr', 'local', 'share', 'comfortable-swipe', 'comfortable-swipe.conf'), os.path.join('/usr/local/share', 'comfortable-swipe', 'comfortable-swipe.conf'),
CONFIG CONFIG
] ]
# for C++ library # for C++ library
cpp_macros = dict( cpp_macros = dict(
__COMFORTABLE_SWIPE__PROGRAM__='"{}"'.format(PROGRAM),
__COMFORTABLE_SWIPE__VERSION__='"{}"'.format(VERSION), __COMFORTABLE_SWIPE__VERSION__='"{}"'.format(VERSION),
__COMFORTABLE_SWIPE__CONFIG__='"{}"'.format(CONFIG) __COMFORTABLE_SWIPE__CONFIG__='"{}"'.format(CONFIG)
) )
try:
# make sure working directory is here
os.chdir(__DIR__)
# save README as long_description # save README as long_description
with open('README.md', 'r') as README_file: with open('README.md', 'r') as README_file:
README = README_file.read() README = README_file.read()
@ -64,8 +57,87 @@ try:
libraries=['xdo'] libraries=['xdo']
) for extension_name in extension_names] ) for extension_name in extension_names]
def pre_install(self):
pass
def post_install(self):
# create program/config directories
if not os.path.exists(os.path.dirname(CONFIG)):
os.makedirs(os.path.dirname(CONFIG))
# copy any of the old config files
conf_files = [path for path in conf_paths if os.path.exists(path) and os.path.isfile(path)]
print('Using configuration file at', conf_files[-1])
if conf_files[-1] != CONFIG:
# new installation or upgrading from old version, copy to new location
copyfile(conf_files[-1], CONFIG)
if conf_files[-1] == os.path.join(__DIR__, 'defaults.conf'):
# new installation - copy default configuration
print('Copying configuration file to', CONFIG)
else:
# upgrading - delete the deprecated config file (failsafe)
print('warning: depcrecated configuration file at', conf_files[-1])
print(' you have to remove this manually')
# toggle autostart
os.chdir(os.getenv('HOME'))
from comfortable_swipe import service
service.autostart()
service.autostart()
print('\nInstallation successful\nTry running "{} start"'.format(NAME))
def pre_uninstall(self):
# remove autostart config
from comfortable_swipe import util
autostart_filename = str(util.autostart_filename)
if os.path.exists(autostart_filename):
print('Removing autostart', autostart_filename)
os.remove(autostart_filename)
def post_uninstall(self):
# provide warning for manual removal of configuration file
if os.path.exists(CONFIG) and os.path.isfile(CONFIG):
print('You have to manually remove {}'.format(CONFIG))
print('Successfully uninstalled', NAME)
# add post_install script to install method
class Install(install):
def run(self):
pre_install(self)
install.run(self)
post_install(self)
class Develop(develop):
def run(self):
if self.uninstall:
pre_uninstall(self)
else:
pre_install(self)
develop.run(self)
if self.uninstall:
post_uninstall(self)
else:
post_install(self)
# Override command classes here
cmdclass = dict(install=Install, develop=Develop)
# setup python script # setup python script
setup( setup_script = setup(
name=NAME, name=NAME,
version=VERSION, version=VERSION,
description='Comfortable 3-finger and 4-finger swipe gestures', description='Comfortable 3-finger and 4-finger swipe gestures',
@ -74,51 +146,13 @@ try:
author='Rico Tiongson', author='Rico Tiongson',
author_email='thericotiongson@gmail.com', author_email='thericotiongson@gmail.com',
url=__URL__, url=__URL__,
zip_safe=True, zip_safe=False,
packages=find_packages(), packages=find_packages(),
entry_points=dict(console_scripts=['{}=comfortable_swipe:main'.format(NAME)]), entry_points=dict(console_scripts=['{}=comfortable_swipe.__main__:main'.format(NAME)]),
ext_modules=extensions, ext_modules=extensions,
# include program to sources so it will be removed on uninstall cmdclass=cmdclass
) )
class Install(install):
def run(self):
# perform original run command
install.run(self)
# create program/config directories
os.path.exists(os.path.dirname(PROGRAM)) or os.makedirs(os.path.dirname(PROGRAM))
os.path.exists(os.path.dirname(CONFIG)) or os.makedirs(os.path.dirname(CONFIG))
# copy any of the old config files
conf_files = [path for path in conf_paths if os.path.exists(path) and os.path.isfile(path)]
print('using configuration file at', conf_files[-1])
if conf_files[-1] != CONFIG:
# new installation or upgrading from old version, copy to new location
copyfile(conf_files[-1], CONFIG)
if conf_files[-1] == os.path.join(__DIR__, 'defaults.conf'):
# new installation - copy default configuration
print('copying configuration file to', CONFIG)
else:
# upgrading - delete the deprecated config file (failsafe)
try:
os.remove(conf_files[-1])
print('moving deprecated configuration file to', CONFIG)
except:
pass
# toggle autostart
os.chdir(os.getenv('HOME'))
from comfortable_swipe import service
service.autostart()
service.autostart()
print('\nTry running "{} start" to test'.format(NAME))
finally: finally:
# move working directory back to where it was before # move working directory back to where it was before
os.chdir(__DIR__) os.chdir(__CWD__)