From ca6ba38cdd44ad560a496b3fef97b64adcd28e3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B0=D0=BC=D0=BE=D1=83=D0=BA=D0=B8=D0=BD=20=D0=90?= =?UTF-8?q?=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9?= Date: Thu, 20 May 2010 16:09:19 +0400 Subject: [PATCH] Creating a calculate-desktop --- LICENCE | 202 ++++++++++++ README | 15 + data/cmd_login | 26 ++ data/functions | 20 ++ data/gtkbg | 52 +++ data/login.d/00init | 29 ++ data/login.d/20desktop | 30 ++ data/login.d/99final | 19 ++ data/logout.d/00init | 17 + data/xdm | 153 +++++++++ desktop-templates/.calculate_directory | 1 + desktop-templates/system/.calculate_directory | 1 + .../system/install/.calculate_directory | 1 + .../system/install/usr/share/config/kdm/kdmrc | 12 + .../system/uninstall/.calculate_directory | 1 + .../uninstall/usr/share/config/kdm/kdmrc | 12 + desktop-templates/user/.calculate_directory | 1 + i18n/cl_desktop_ru.mo | Bin 0 -> 11679 bytes pym/__init__.py | 1 + pym/cl_createhome.py | 85 +++++ pym/cl_desktop.py | 303 ++++++++++++++++++ pym/cl_desktop_install.py | 58 ++++ pym/cl_desktop_uninstall.py | 58 ++++ pym/cl_fill_desktop.py | 218 +++++++++++++ pym/cl_share_cmd.py | 64 ++++ pym/cl_vars_desktop.py | 75 +++++ scripts/cl-createhome-2.2 | 55 ++++ scripts/install | 52 +++ scripts/uninstall | 54 ++++ setup.cfg | 5 + setup.py | 157 +++++++++ 31 files changed, 1777 insertions(+) create mode 100644 LICENCE create mode 100644 README create mode 100644 data/cmd_login create mode 100644 data/functions create mode 100644 data/gtkbg create mode 100644 data/login.d/00init create mode 100644 data/login.d/20desktop create mode 100644 data/login.d/99final create mode 100644 data/logout.d/00init create mode 100755 data/xdm create mode 100644 desktop-templates/.calculate_directory create mode 100644 desktop-templates/system/.calculate_directory create mode 100644 desktop-templates/system/install/.calculate_directory create mode 100644 desktop-templates/system/install/usr/share/config/kdm/kdmrc create mode 100644 desktop-templates/system/uninstall/.calculate_directory create mode 100644 desktop-templates/system/uninstall/usr/share/config/kdm/kdmrc create mode 100644 desktop-templates/user/.calculate_directory create mode 100644 i18n/cl_desktop_ru.mo create mode 100644 pym/__init__.py create mode 100644 pym/cl_createhome.py create mode 100644 pym/cl_desktop.py create mode 100644 pym/cl_desktop_install.py create mode 100644 pym/cl_desktop_uninstall.py create mode 100644 pym/cl_fill_desktop.py create mode 100644 pym/cl_share_cmd.py create mode 100644 pym/cl_vars_desktop.py create mode 100644 scripts/cl-createhome-2.2 create mode 100644 scripts/install create mode 100644 scripts/uninstall create mode 100644 setup.cfg create mode 100755 setup.py diff --git a/LICENCE b/LICENCE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENCE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README b/README new file mode 100644 index 0000000..82ca5d4 --- /dev/null +++ b/README @@ -0,0 +1,15 @@ +AUTHOR: Mir Calculate Ltd. + +INSTALL +------- + +calculate-desktop needs the following library version installed, in order to run: + Python >= 2.5 + python-ldap >= 2.0.0 + pyxml >= 0.8 + calculate-lib >= 2.2.0 + +To install calculate-desktop, just execute the install script 'setup.py'. +Example: + + ./setup.py install diff --git a/data/cmd_login b/data/cmd_login new file mode 100644 index 0000000..c9ba021 --- /dev/null +++ b/data/cmd_login @@ -0,0 +1,26 @@ +#! /bin/sh +# Copyright 2008-2010 Mir Calculate Ltd. http://www.calculate-linux.org +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +PATH_LOG='/var/log/calculate' +FILE_LOG="${PATH_LOG}/cl_login-error.log" +if [ -e $FILE_LOG ]; +then + ERROR=`cat $FILE_LOG` + if [ "$ERROR" ]; + then + exit 1 + fi +fi +exit 0 diff --git a/data/functions b/data/functions new file mode 100644 index 0000000..bb9cb0f --- /dev/null +++ b/data/functions @@ -0,0 +1,20 @@ +# Copyright 2008-2010 Mir Calculate Ltd. http://www.calculate-linux.org +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# bash functions + +xmes() { + xmessage -buttons OK:0 -default OK "`echo \"$1: +$2\" | iconv -f utf8 -t koi8-r - `" +} diff --git a/data/gtkbg b/data/gtkbg new file mode 100644 index 0000000..0cd128e --- /dev/null +++ b/data/gtkbg @@ -0,0 +1,52 @@ +#!/usr/bin/env python +# Copyright 2008-2010 Mir Calculate Ltd. http://www.calculate-linux.org +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pygtk +pygtk.require('2.0') +import gtk +import os +import sys +import re +import subprocess + +if __name__ == "__main__": + if gtk.gdk.get_display(): + window = gtk.Window(gtk.WINDOW_TOPLEVEL) + + # Here we connect the "destroy" event to a signal handler + window.connect("destroy", lambda w: gtk.main_quit()) + pipe = subprocess.Popen(["xdpyinfo"], + stdout=subprocess.PIPE, env=os.environ) + reRes = re.compile("dimensions:\s+(\d+)x(\d+)\s+pixels") + cx, cy = 1024, 768 + if pipe.wait() == 0: + for line in pipe.stdout: + searchRes = reRes.search(line) + if searchRes: + cx, cy = int(searchRes.group(1)), int(searchRes.group(2)) + break + pipe.stdout.close() + window.set_size_request(cx,cy) + window.maximize() + + window.set_border_width(0) + window.modify_bg(gtk.STATE_NORMAL, + gtk.gdk.rgb_get_colormap().alloc_color('#5F7583')) + + window.show() + pid = os.fork() + if not pid: + gtk.main() + sys.exit(0) diff --git a/data/login.d/00init b/data/login.d/00init new file mode 100644 index 0000000..1188962 --- /dev/null +++ b/data/login.d/00init @@ -0,0 +1,29 @@ +#! /bin/sh +# Copyright 2010 Mir Calculate Ltd. http://www.calculate-linux.org +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# set background color +xsetroot -solid rgb:5F/75/83 + +if [[ "`ps axeo command | grep 'xdm/xdm --logout' | grep -v grep | \ + sed -n -r 's/.* USER=([^ ]+) .*/\1/p'`" == "$USER" ]]; +then + xmessage -buttons "" "Please wait to ending previous session" & + while [[ "`ps axeo command | grep 'xdm/xdm --logout' | grep -v grep | \ + sed -n -r 's/.* USER=([^ ]+) .*/\1/p'`" == "$USER" ]] + do + sleep 1 + done + kill -9 `ps ax | sed -n -r '/grep/!{s/([0-9]+) .*xmessage -buttons Please.*/\1/p}'` &>/dev/null +fi \ No newline at end of file diff --git a/data/login.d/20desktop b/data/login.d/20desktop new file mode 100644 index 0000000..f7455e7 --- /dev/null +++ b/data/login.d/20desktop @@ -0,0 +1,30 @@ +#! /bin/sh +# Copyright 2010 Mir Calculate Ltd. http://www.calculate-linux.org +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +env-update +source /etc/profile +source /usr/share/calculate-2.2/xdm/functions + +if [ -e '/usr/bin/cl-createhome-2.2' ]; +then + ERRORLOG=`/usr/bin/cl-createhome-2.2 --progress --color=never $USER 2>&1` + # при неудачном выполнении, сгенерируем ошибку + if [ "$?" -gt "0" ]; + then + echo "$ERRORLOG" >> $FILE_LOG + xmes cl-createhome "$ERRORLOG" + exit 1 + fi +fi \ No newline at end of file diff --git a/data/login.d/99final b/data/login.d/99final new file mode 100644 index 0000000..10335ed --- /dev/null +++ b/data/login.d/99final @@ -0,0 +1,19 @@ +#! /bin/sh +# Copyright 2008-2010 Mir Calculate Ltd. http://www.calculate-linux.org +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# очистим кэш +/bin/rm -rf /var/tmp/kdecache-$USER +exit 0 \ No newline at end of file diff --git a/data/logout.d/00init b/data/logout.d/00init new file mode 100644 index 0000000..c96bf2c --- /dev/null +++ b/data/logout.d/00init @@ -0,0 +1,17 @@ +#! /bin/sh +# Copyright 2010 Mir Calculate Ltd. http://www.calculate-linux.org +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# set background color +xsetroot -solid rgb:5F/75/83 \ No newline at end of file diff --git a/data/xdm b/data/xdm new file mode 100755 index 0000000..4e85f67 --- /dev/null +++ b/data/xdm @@ -0,0 +1,153 @@ +#!/bin/bash + +source /usr/share/calculate-2.2/xdm/functions + +progname=$0 + +SHORTOPTS="h" +LONGOPTS="login,logout,help" + + +PATH_LOG='/var/log/calculate' +FILE_LOG="${PATH_LOG}/cl_login-error.log" + +print_help() { + cat <<'EOF' +Usage: xdm --login|--logout + +Execute scripts in /etc/calculate/xdm/login.d or /etc/calculate/xdm/logout.d . + +Options: + --login Execute all scripts in /etc/calculate/login.d + --logout Execute all scripts in /etc/calculate/login.d + -h, --help Print this help message +EOF +} + +warning() { + echo "Warning: "$1 1>&2 +} + +writelog() { + local ERROR_MESSAGE="${1}" + if [[ ! -e $PATH_LOG && -w /var/log ]]; + then + # Создадим директорию логов + mkdir $PATH_LOG + fi + # если права на файл не 755 + if [[ "`stat ${PATH_LOG} | sed -n -r '/Access: \(/ {s/.*\([0-9]([^/]+).*/\1/;p}'`" != "755" && -w $PATH_LOG ]]; + then + chmod 755 $PATH_LOG + fi + + if [[ -n $ERROR_MESSAGE && -w $FILE_LOG ]]; + then + # Запишем ошибку в файл + echo "$ERROR_MESSAGE" >> $FILE_LOG + fi +} + +die() { + [[ -n $BG_PID ]] && kill $BG_PID + echo "Error: "$1 1>&2 + writelog "${1}" + umount_user_res + exit 1 +} + + +die_xmes() { + xmes "${1}" + die "${1}" +} + +gtk_background(){ + if [[ -n $(env | grep RUNNING_UNDER_GDM=true) ]]; + then + python /usr/share/calculate-2.2/xdm/gtkbg + BG_PID=$(ps ax | sed -nr "s/^\s*([0-9]+)\s.*gtkbg$/\1/p") + fi +} + +umount_user_res(){ + if [[ -n $USER && -z `who | awk '{ print $1, $2 }' | grep -P ":\d+" | awk '{ print $1}' | grep $USER` ]]; + then + HOME_DIR=`getent passwd $USER | awk -F: '{ print( $6 ); }'` + PROFILE_DIR=`dirname $HOME_DIR`/.`basename $HOME_DIR` + REMOTE_PROFILE_DIR=`dirname $HOME_DIR`/.`basename $HOME_DIR`.remote + ALL_MOUNT_DIRS=`cat /proc/mounts | grep -e $HOME_DIR -e $PROFILE_DIR -e $REMOTE_PROFILE_DIR | awk '{ print $2 }'` + ALL_MOUNT_DIRS=`echo $ALL_MOUNT_DIRS | awk '{ for (i = NF; i > 0; --i) print $i }'` + for MOUNT_DIR in $ALL_MOUNT_DIRS; + do + KILL_PIDS=`fuser ${MOUNT_DIR} 2>/dev/null` + if [[ -n $KILL_PIDS ]]; + then + kill -9 KILL_PIDS + fi + umount "${MOUNT_DIR}" + done + fi +} + + +OPTS=$(getopt -o $SHORTOPTS --long $LONGOPTS -n "$progname" -- "$@") + +if [ $? -ne 0 ]; then + echo "'$progname --help' for more information" 1>&2 + exit 1 +fi +eval set -- "$OPTS" + +EXECDIR=/etc/calculate/xdm + +if [[ -w $FILE_LOG ]]; then + # Очистим лог ошибок + echo -n "" > $FILE_LOG +fi + +while [ $# -gt 0 ]; do + case $1 in + -h|--help) + print_help + exit 0 + ;; + --login) + [[ $EXECDIR == /etc/calculate/xdm ]] || + die "only one of --login or --logout must be specified" + EXECDIR=${EXECDIR}/login.d + shift 1 + ;; + --logout) + [[ $EXECDIR == /etc/calculate/xdm ]] || + die "only one of --login or --logout must be specified" + EXECDIR=${EXECDIR}/logout.d + shift 1 + ;; + --) + shift + ;; + *) + die "unrecognized option: $1" + ;; + esac +done +if [[ $EXECDIR == /etc/calculate/xdm ]]; then + die "must specify option" +fi + + +[[ -e ${EXECDIR} ]] || die "${EXECDIR} is not exists" + +FILELIST=$(find ${EXECDIR} -type f | sort) +[[ $FILELIST ]] || warning "${EXECDIR} hasn't scripts" + +gtk_background + +for script in $FILELIST +do + FILE_LOG=$FILE_LOG /bin/bash $script || die_xmes "failed on execute $script" +done + +[[ -n $BG_PID ]] && kill $BG_PID +exit 0 \ No newline at end of file diff --git a/desktop-templates/.calculate_directory b/desktop-templates/.calculate_directory new file mode 100644 index 0000000..1691ec0 --- /dev/null +++ b/desktop-templates/.calculate_directory @@ -0,0 +1 @@ +# Calculate append=skip cl_name==calculate-desktop \ No newline at end of file diff --git a/desktop-templates/system/.calculate_directory b/desktop-templates/system/.calculate_directory new file mode 100644 index 0000000..285f21e --- /dev/null +++ b/desktop-templates/system/.calculate_directory @@ -0,0 +1 @@ +# Calculate append=skip cl_pass_action==install||cl_pass_action==uninstall diff --git a/desktop-templates/system/install/.calculate_directory b/desktop-templates/system/install/.calculate_directory new file mode 100644 index 0000000..f1f0199 --- /dev/null +++ b/desktop-templates/system/install/.calculate_directory @@ -0,0 +1 @@ +# Calculate append=skip cl_pass_action==install \ No newline at end of file diff --git a/desktop-templates/system/install/usr/share/config/kdm/kdmrc b/desktop-templates/system/install/usr/share/config/kdm/kdmrc new file mode 100644 index 0000000..d30cedb --- /dev/null +++ b/desktop-templates/system/install/usr/share/config/kdm/kdmrc @@ -0,0 +1,12 @@ +# Calculate format=kde exists(/usr/share/config/kdm/kdmrc)==1 +[X-*-Core] +Reset=/usr/share/calculate/xdm/logout +Startup=/usr/share/calculate/xdm/login +#?cl_remote_host!=# +[X-*-Greeter] +MinShowUID=1000 +#cl_remote_host# +#?cl_remote_host==# +[X-*-Greeter] +MinShowUID=999 +#cl_remote_host# diff --git a/desktop-templates/system/uninstall/.calculate_directory b/desktop-templates/system/uninstall/.calculate_directory new file mode 100644 index 0000000..ac8e15b --- /dev/null +++ b/desktop-templates/system/uninstall/.calculate_directory @@ -0,0 +1 @@ +# Calculate append=skip cl_pass_action==uninstall diff --git a/desktop-templates/system/uninstall/usr/share/config/kdm/kdmrc b/desktop-templates/system/uninstall/usr/share/config/kdm/kdmrc new file mode 100644 index 0000000..8e832a5 --- /dev/null +++ b/desktop-templates/system/uninstall/usr/share/config/kdm/kdmrc @@ -0,0 +1,12 @@ +# Calculate format=kde exists(/usr/share/config/kdm/kdmrc)==1 +[X-*-Core] +Reset=/usr/share/config/kdm/Xreset +Startup=/usr/share/config/kdm/Xstartup +#?cl_remote_host!=# +[X-*-Greeter] +MinShowUID=1000 +#cl_remote_host# +#?cl_remote_host==# +[X-*-Greeter] +MinShowUID=999 +#cl_remote_host# diff --git a/desktop-templates/user/.calculate_directory b/desktop-templates/user/.calculate_directory new file mode 100644 index 0000000..34bad2e --- /dev/null +++ b/desktop-templates/user/.calculate_directory @@ -0,0 +1 @@ +# Calculate path=~ name= chmod=0700 chown=#-ur_login-#:#-ur_group-# cl_pass_action==user diff --git a/i18n/cl_desktop_ru.mo b/i18n/cl_desktop_ru.mo new file mode 100644 index 0000000000000000000000000000000000000000..053cdc55ec6a3b4cbcb63a8770efc9fc4f81b909 GIT binary patch literal 11679 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 literal 0 HcmV?d00001 diff --git a/pym/__init__.py b/pym/__init__.py new file mode 100644 index 0000000..8d1c8b6 --- /dev/null +++ b/pym/__init__.py @@ -0,0 +1 @@ + diff --git a/pym/cl_createhome.py b/pym/cl_createhome.py new file mode 100644 index 0000000..f0934ac --- /dev/null +++ b/pym/cl_createhome.py @@ -0,0 +1,85 @@ +#-*- coding: utf-8 -*- + +# Copyright 2010 Mir Calculate Ltd. http://www.calculate-linux.org +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from cl_desktop import desktop, __app__, __version__ +from cl_opt import opt, TitledHelpFormatter +import sys +from cl_share_cmd import share_cmd + +# Перевод сообщений для программы +from cl_lang import lang +lang().setLanguage(sys.modules[__name__]) + +# Использование программы +USAGE = _("%prog [options] user") + +# Коментарии к использованию программы +COMMENT_EXAMPLES = _("Create home directory for the user_name") + +# Пример использования программы +EXAMPLES = _("%prog user_name") + +# Описание программы (что делает программа) +DESCRIPTION = _("Create home directory for the new user account") + +# Опции командной строки +CMD_OPTIONS = [{'longOption':"progress", + 'help':_("show progress bar for xdm startup")}] + +class createhome(share_cmd): + def __init__(self): + # Объект опций командной строки + self.optobj = opt(\ + package=__app__, + version=__version__, + usage=USAGE, + examples=EXAMPLES, + comment_examples=COMMENT_EXAMPLES, + description=DESCRIPTION, + option_list=CMD_OPTIONS + opt.variable_control+opt.color_control, + formatter=TitledHelpFormatter(), + check_values=self.checkOpts) + # Создаем объект логики + self.logicObj = desktop() + # Создаем переменные + self.logicObj.createClVars() + + def checkOpts(self, optObj, args): + """Проверка опций командной строки""" + if not args: + errMsg = _("no such argument") + ":" + " %s" %USAGE.split(" ")[-1] + self.optobj.error(errMsg) + return False + if len(args)>1: + errMsg = _("incorrect argument") + ":" + " %s" %" ".join(args) + self.optobj.error(errMsg) + return False + userName = args[0] + if userName == "root": + errMsg = _("invalid username") + ":" + " %s" %" ".join(args) + self.optobj.error(errMsg) + return False + # Проверка на существование пользователя + if not self.logicObj.existsUser(userName): + return False + return optObj, args + + def setUserName(self, userName): + """Установка имени пользователя""" + self.logicObj.clVars.Set("ur_login", userName, True) + + def createHome(self, optObj): + """Создание домашней директории""" + return self.logicObj.createHome(optObj.progress) \ No newline at end of file diff --git a/pym/cl_desktop.py b/pym/cl_desktop.py new file mode 100644 index 0000000..ffb2d72 --- /dev/null +++ b/pym/cl_desktop.py @@ -0,0 +1,303 @@ +#-*- coding: utf-8 -*- + +# Copyright 2010 Mir Calculate Ltd. http://www.calculate-linux.org +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +__version__ = "2.2.0" +__version_info__ = tuple([int(num) for num in __version__.split('.')]) +__app__ = "calculate-desktop" + +import os +import re +import sys +import pwd + +from cl_lang import lang +from cl_template import template +from cl_datavars import DataVars +from cl_print import color_print +from cl_ldap import ldapUser +from client.progressbar import ProgressBar +from cl_utils import runOsCommand, getpathenv + +lang().setLanguage(sys.modules[__name__]) + +class DataVarsDesktop(DataVars): + """Хранение переменных""" + + def flDesktop(self, **args): + '''Заполнить конфигурацию переменных, для десктопа''' + # Имя секции в calculate.env + envSection = "desktop" + # заполнить переменные окружения алгоритмом по умолнанию + self.importData(envSection, ('cl_vars_desktop','cl_fill_desktop')) + +class ProgressTemplate(template): + def __init__(self, vars): + template.__init__(self, vars) + self.progress = ProgressBar(_("Setting up user profile") + " ...") + + def numberAllTemplates(self, number): + self.progress.setMaximum(number) + return True + + def numberProcessTemplates(self,number): + self.progress.setValue(number) + return True + + def close(self): + self.progress.shutdownDialog() + +class share(color_print): + """Общие методы""" + # Объект хранения переменных + clVars = False + + def isRoot(self, printError=True): + """Определяет является ли пользователь root""" + if os.getuid() == 0 and os.getgid() == 0: + return True + else: + if printError: + self.printERROR(_("The user is not root")) + return False + + def createClVars(self, clVars=False): + """Создает объект Vars""" + if not clVars: + clVars = DataVarsDesktop() + clVars.flDesktop() + clVars.flIniFile() + # Устанавливаем у объекта объект Vars + self.clVars = clVars + return True + + def applyTemplatesFromSystem(self): + """Применяем шаблоны для cистемы""" + # Cоздаем объект обработки шаблонов + clTempl = template(self.clVars) + # Объединяем шаблоны + dirsFiles = clTempl.applyTemplates() + if clTempl.getError(): + self.printERROR(clTempl.getError().strip()) + return False + else: + return dirsFiles + + def printVars(self, opts): + """Печать существующих переменных""" + if opts == ["all"]: + self.clVars.printVars() + else: + self.clVars.printVars(opts) + + +class install(share): + """Методы для наложения шаблонов на систему при инсталяции программы""" + + def installProg(self): + """Наложение шаблонов на систему при инсталяции""" + # Проверяем на root + if not self.isRoot(): + return False + # Действие инсталяция + self.clVars.Set("cl_pass_action", "install", True) + if not self.applyTemplatesFromSystem(): + self.printERROR(_("Can not apply install templates")) + return False + self.printOK(_("Apply install templates")) + return True + +class uninstall(share): + """Методы для наложения шаблонов на систему при деинсталяции программы""" + + def uninstallProg(self): + """Наложение шаблонов на систему при деинсталяции""" + # Проверяем на root + if not self.isRoot(): + return False + # Действие деинсталяция + self.clVars.Set("cl_pass_action", "uninstall", True) + if not self.applyTemplatesFromSystem(): + self.printERROR(_("Can not apply uninstall templates")) + return False + self.printOK(_("Apply uninstall templates")) + return True + +class desktop(share): + """Методы работы с профилем пользователя""" + # Имя пользователя + userName = "" + + # Объект для поиска пользовательских данных в LDAP + ldapUserObj = ldapUser() + + def existsUser(self, userName): + """Существует ли пользователь""" + try: + pwd.getpwnam(userName).pw_gid + except: + self.printERROR(_("User %s not exists")%userName) + return False + return True + + def createUserDir(self, uid, gid, userDir, mode=0700): + """Создание пользовательской директории""" + if not os.path.exists(userDir): + os.makedirs(userDir) + if mode: + os.chmod(userDir,mode) + os.chown(userDir,uid,gid) + return True + else: + self.printERROR(_("Path %s exists") %userDir) + return False + + def applyTemplatesFromUser(self,progress=False): + """Применяем шаблоны для пользователя""" + # Cоздаем объект обработки шаблонов + if progress: + clTempl = ProgressTemplate(self.clVars) + else: + clTempl = template(self.clVars) + # Объединяем шаблоны + dirsFiles = clTempl.applyTemplates() + if progress: + clTempl.close() + if clTempl.getError(): + self.printERROR(clTempl.getError().strip()) + return False + else: + return dirsFiles + + def createHome(self, progress=False): + """Создание профиля пользователя (пользовательской директории)""" + # Имя пользователя + userName = self.clVars.Get("ur_login") + # Проверяем на root + if not self.isRoot(): + return False + uidGid = False + # Домен для подключения Samba + domain = self.clVars.Get("cl_remote_host") + if domain: + # Информация о пользователе из LDAP + userLdapInfo = ldapUserObj.getUserLdapInfo(userName) + if userLdapInfo: + uid = int(userLdapInfo['uid']) + gid = int(userLdapInfo['uid']) + homeDir = userLdapInfo['home'] + else: + self.printERROR(_("Can not found user %s in LDAP")%userName) + self.unmountUserRes() + return False + else: + pwdInfo = pwd.getpwnam(userName) + uid = pwdInfo.pw_uid + gid = pwdInfo.pw_gid + homeDir = pwdInfo.pw_dir + # Создаем пользовательскую директорию + rootPath = self.clVars.Get('cl_root_path') + # Реальный путь к домашней директории + homeDir = os.path.join(rootPath, homeDir[1:]) + # Домашняя директория существует + flagHomeExists = True + # Создаем домашнюю директорию если ее нет + if not os.path.exists(homeDir): + flagHomeExists = False + self.createUserDir(uid, gid, homeDir) + # Действие шаблоны пользователя + self.clVars.Set("cl_pass_action", "user", True) + # Применяем профили для пользователя + dirsAndFiles = self.applyTemplatesFromUser(progress) + if not dirsAndFiles: + # Отмонтируем пользовательские ресурсы в случае ошибки + self.printERROR(_("Can not apply user profile")) + self.unmountUserRes(homeDir) + return False + if not flagHomeExists: + self.printSUCCESS(_("Created home dir %s")%homeDir + " ...") + self.printSUCCESS(_("User account is configured") + " ...") + return True + + + def getMountUserPaths(self, homeDir=False): + """Находит пользовательские примонтированные пути""" + # Имя пользователя + if not homeDir: + userName = self.clVars.Get("ur_login") + try: + homeDir = pwd.getpwnam(userName).pw_dir + except: + homeDir = os.path.join("/home",userName) + dirStart, dirEnd = os.path.split(homeDir) + mountProfileDir = os.path.join(dirStart, ".%s" %dirEnd) + mountRemoteProfileDir = os.path.join(dirStart, ".%s.remote" %dirEnd) + return filter(lambda x: x.startswith(homeDir) or\ + x.startswith(mountProfileDir) or\ + x.startswith(mountRemoteProfileDir), + map(lambda x: x.split(" ")[1],\ + open("/proc/mounts").readlines())) + + def execProg(self, cmdStrProg, inStr=False, retFull=True, envProg={}): + """Выполняет внешнюю программу + + Параметры: + cmdStrProg внешняя программа + inStr данные передаваемые программе на страндартный вход. + Возвращаемые параметры: + строка которую выведет внешняя программа или False в случае ошибки + """ + env_path = {"PATH":getpathenv()} + env = {} + env.update(os.environ.items() + env_path.items() + envProg.items()) + retCode,programOut = runOsCommand(cmdStrProg,inStr,retFull,env) + if not retCode: + return programOut + return False + + def umountSleepPath(self, path): + """Отмонтирует путь при неудаче задержка потом повтор""" + # Задержки при отмонтированиии директории + sleeps = [0.5, 2, 5] + # Проверяем на монтирование директорию + if os.path.ismount(path): + textLine = self.execProg("umount %s"%path) + if textLine is False: + i = 0 + flagError = False + while (i= width and h >= height: + stResol.append((w,h)) + stHeights.append(h) + if stHeights: + stHeight = min(stHeights) + for w, h in stResol: + if stHeight == h: + stWidths.append(w) + if stWidths: + stWidth = min(stWidths) + if (not stWidth) or (not stHeight): + return "%sx%s"%(resolution[-1][0],resolution[-1][1]) + else: + return "%sx%s"%(stWidth,stHeight) + + def get_hr_x11_composite(self): + """Включен ли композитный режим видеокарты on/off""" + xorgConfig = "/etc/X11/xorg.conf" + try: + confLines = open(xorgConfig,"r").readlines() + except: + return "off" + flagStartExtensions = False + lineCompositeTmp = "" + lineComposite = "" + for line in confLines: + if flagStartExtensions: + if 'EndSection' in line: + lineComposite = lineCompositeTmp + break + elif 'Section' in line: + break + if 'Option' in line and '"Composite"' in line: + lineCompositeTmp = line + else: + if '"Extensions"' in line and 'Section' in line: + flagStartExtensions = True + if lineComposite: + listOpt = filter(lambda x: x.strip(), lineComposite.split('"')) + if len(listOpt) == 3: + ret = listOpt[2].lower() + if ret in ("on","off"): + return ret + return "off" + + + def get_hr_laptop(self): + """Если компьютер ноутбук, то его производитель""" + formfactor = self._runos("hal-get-property --udi \ +/org/freedesktop/Hal/devices/computer --key system.formfactor") + if not formfactor: + return "" + if formfactor == 'laptop': + vendor = self._runos("hal-get-property --udi \ +/org/freedesktop/Hal/devices/computer --key system.hardware.vendor") + if vendor: + vendor = vendor.split(" ")[0] + else: + vendor = "unknown" + return vendor.lower() + return "" + + def get_hr_x11_video_drv(self): + """Get video driver used by xorg""" + xorg_modules_dir = '/usr/lib/xorg/modules/drivers' + xorg_conf = '/etc/X11/xorg.conf' + # Try analize Xorg.{DISPLAY}.log + display = os.environ.get('DISPLAY') + if display and os.path.exists(xorg_modules_dir): + list_avialable_drivers = os.listdir(xorg_modules_dir) + if list_avialable_drivers: + reDriver = re.compile('|'.join(list_avialable_drivers)) + display_number = re.search(r':(\d+)\..*', display) + if display_number: + xorg_log_file = '/var/log/Xorg.%s.log' % \ + display_number.group(1) + if os.path.exists(xorg_log_file): + matchStrs = [i for i in open(xorg_log_file) + if "drv" in i and reDriver.search(i)] + if matchStrs: + resDriver = re.search(r'([^/]+)_drv.so', + matchStrs[-1]) + if resDriver: + return resDriver.group(1) + + # analize /etc/X11/xorg.conf + if os.path.exists(xorg_conf): + matchSect = re.search(r'Section "Device".*?EndSection', + open('/etc/X11/xorg.conf').read(),re.S) + if matchSect: + resDriver = re.search(r'Driver\s*"([^"]+)"', + matchSect.group(0),re.S) + if resDriver: + return resDriver.group(1) + return "vesa" + + def get_hr_video(self): + """Производитель видеокарты""" + lines=self._runos("lspci") + if not lines: + return "" + reVGA = re.compile("vga",re.I) + foundVGA = False + for line in lines: + if reVGA.search(line): + foundVGA = True + break + if not foundVGA: + return "vesa" + if "nVidia" in line or "GeForce" in line: + return "nvidia" + elif "ATI" in line: + return "ati" + elif "Intel" in line: + return "intel" + elif "VIA" in line: + return "via" + elif "VMware" in line: + return "vmware" + else: + return "vesa" + diff --git a/pym/cl_share_cmd.py b/pym/cl_share_cmd.py new file mode 100644 index 0000000..cec0b1d --- /dev/null +++ b/pym/cl_share_cmd.py @@ -0,0 +1,64 @@ +#-*- coding: utf-8 -*- + +# Copyright 2010 Mir Calculate Ltd. http://www.calculate-linux.org +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys + +from cl_print import color_print +from cl_utils import _error + +# Перевод сообщений для программы +from cl_lang import lang +lang().setLanguage(sys.modules[__name__]) + +class share_cmd(color_print, _error): + """Класс общих методов обработки опций командной строки""" + def printVars(self, optObj): + """Печать переменных""" + if optObj.vars: + terms = optObj.vars.split(",") + self.logicObj.printVars(terms) + + def setVars(self, optObj): + """Установка переменных""" + if optObj.set: + for vals in optObj.set: + for val in vals.split(','): + k,o,v = val.partition('=') + if self.logicObj.clVars.exists(k): + if not self.logicObj.clVars.SetWriteVar(k,v): + return False + else: + self.printERROR(_('variable %s not found')%k) + return False + return True + + def writeVars(self, optObj): + """Запись переменных""" + if optObj.set: + if not self.logicObj.clVars.WriteVars(): + errMsg = self.getError() + if errMsg: + self.printERROR(errMsg.strip()) + self.printERROR(_('Can not write template variables')) + return False + return True + + def setPrintNoColor(self, optObj): + """Установка печати сообщений без цвета""" + if optObj.color and optObj.color=="never": + color_print.colorPrint = lambda *arg : sys.stdout.write(arg[-1]) or\ + sys.stdout.flush() + diff --git a/pym/cl_vars_desktop.py b/pym/cl_vars_desktop.py new file mode 100644 index 0000000..ec9fdeb --- /dev/null +++ b/pym/cl_vars_desktop.py @@ -0,0 +1,75 @@ +#-*- coding: utf-8 -*- + +# Copyright 2010 Mir Calculate Ltd. http://www.calculate-linux.org +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#Допустимые ключи +# mode - режим переменной r-не переназначается из командной строки, +# w-переназначается из командной строки +# type - тип переменной состоит из двух элементов(что это и для чего +# это) +# value - значение переменной по умолчанию +# official - флаг того, что данная переменная служебная и не отображается +# при печати списка значений переменных + +from cl_desktop import __version__ +from cl_desktop import __app__ + +class Data: + # имя программы + cl_name = {'value':__app__} + + # версия программы + cl_ver = {'value':__version__} + + # ip или имя домена (под управлением calculate-server) + cl_remote_host = {'mode':'r'} + + #Логин пользователя + ur_login = {'mode':"r"} + + #Название группы пользователя + ur_group = {'mode':"r"} + + #Полное имя пользователя + ur_fullname = {'mode':"r"} + + # Jabber ID пользователя + ur_jid = {'mode':"r"} + + # Почтовый адрес пользователя + ur_mail = {'mode':"r"} + + #Разрешение X по вертикали + hr_x11_height = {'mode':"w"} + + #Разрешение X по горизонтали + hr_x11_width = {'mode':"w"} + + # ближайший стандартный размер изображения к текущему разрешению + hr_x11_standart = {} + + # Если компьютер ноутбук, то его производитель + hr_laptop = {} + + # Название производителя видеокарты + hr_video = {} + + # Video driver used by xorg + hr_x11_video_drv = {} + + # Включен ли композитный режим видеокарты on/off + hr_x11_composite = {} + + diff --git a/scripts/cl-createhome-2.2 b/scripts/cl-createhome-2.2 new file mode 100644 index 0000000..cf36a01 --- /dev/null +++ b/scripts/cl-createhome-2.2 @@ -0,0 +1,55 @@ +#!/usr/bin/python +#-*- coding: utf-8 -*- + +# Copyright 2010 Mir Calculate Ltd. http://www.calculate-linux.org +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys +import os +sys.path.insert(0,os.path.abspath('/usr/lib/calculate-2.2/calculate-lib/pym')) +sys.path.insert(0,\ + os.path.abspath('/usr/lib/calculate-2.2/calculate-desktop/pym')) + +from cl_createhome import createhome + +from cl_lang import lang +tr = lang() +tr.setGlobalDomain('cl_desktop') +tr.setLanguage(sys.modules[__name__]) + +if __name__ == "__main__": + obj = createhome() + ret = obj.optobj.parse_args() + if ret is False: + sys.exit(1) + opts, args = ret + userName = args[0] + # Установка цвета при печати сообщений + obj.setPrintNoColor(opts) + # Установка имени пользователя + obj.setUserName(userName) + # Установка переменных + if not obj.setVars(opts): + sys.exit(1) + # Печать переменных + obj.printVars(opts) + # Если нет печати переменных выполняем логику программы + if not opts.vars: + # Создаем домашнюю директорию, и применяем шаблоны + if not obj.createHome(opts): + sys.exit(1) + # Запись переменных + if not obj.writeVars(opts): + sys.exit(1) + sys.exit(0) diff --git a/scripts/install b/scripts/install new file mode 100644 index 0000000..d354c46 --- /dev/null +++ b/scripts/install @@ -0,0 +1,52 @@ +#!/usr/bin/python +#-*- coding: utf-8 -*- + +# Copyright 2010 Mir Calculate Ltd. http://www.calculate-linux.org +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys +import os +sys.path.insert(0,os.path.abspath('/usr/lib/calculate-2.2/calculate-lib/pym')) +sys.path.insert(0,\ + os.path.abspath('/usr/lib/calculate-2.2/calculate-desktop/pym')) + +from cl_desktop_install import install_cmd + +from cl_lang import lang +tr = lang() +tr.setGlobalDomain('cl_desktop') +tr.setLanguage(sys.modules[__name__]) + +if __name__ == "__main__": + obj = install_cmd() + ret = obj.optobj.parse_args() + if ret is False: + sys.exit(1) + opts, args = ret + # Установка цвета при печати сообщений + obj.setPrintNoColor(opts) + # Установка переменных + if not obj.setVars(opts): + sys.exit(1) + # Печать переменных + obj.printVars(opts) + # Если нет печати переменных выполняем логику программы + if not opts.vars: + # Наложение шаблонов на систему при инсталяции + if not obj.installProg(): + sys.exit(1) + # Запись переменных + if not obj.writeVars(opts): + sys.exit(1) + sys.exit(0) diff --git a/scripts/uninstall b/scripts/uninstall new file mode 100644 index 0000000..d210800 --- /dev/null +++ b/scripts/uninstall @@ -0,0 +1,54 @@ +#!/usr/bin/python +#-*- coding: utf-8 -*- + +# Copyright 2010 Mir Calculate Ltd. http://www.calculate-linux.org +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys +import os +sys.path.insert(0,os.path.abspath('/usr/lib/calculate-2.2/calculate-lib/pym')) +sys.path.insert(0,\ + os.path.abspath('/usr/lib/calculate-2.2/calculate-desktop/pym')) + +from cl_desktop_uninstall import uninstall_cmd + +from cl_lang import lang +tr = lang() +tr.setGlobalDomain('cl_desktop') +tr.setLanguage(sys.modules[__name__]) + +if __name__ == "__main__": + obj = uninstall_cmd() + ret = obj.optobj.parse_args() + if ret is False: + sys.exit(1) + opts, args = ret + # Установка цвета при печати сообщений + obj.setPrintNoColor(opts) + # Установка переменных + if not obj.setVars(opts): + sys.exit(1) + # Печать переменных + obj.printVars(opts) + # Если нет печати переменных выполняем логику программы + if not opts.vars: + # Наложение шаблонов на систему при деинсталяции + if not obj.uninstallProg(): + sys.exit(1) + # Запись переменных + if not obj.writeVars(opts): + sys.exit(1) + sys.exit(0) + + diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..00b055c --- /dev/null +++ b/setup.cfg @@ -0,0 +1,5 @@ +[install] +install-scripts=/usr/bin +install-purelib=/usr/lib/calculate-2.2 +install-platlib=/usr/lib/calculate-2.2 +install-data=/usr/share/calculate-2.2/templates \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100755 index 0000000..99573d6 --- /dev/null +++ b/setup.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# setup.py --- Setup script for calculate-client + +#Copyright 2010 Calculate Pack, http://www.calculate-linux.org +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import stat +from distutils.core import setup +from distutils.command.install_data import install_data +from distutils.command.build_scripts import build_scripts +from distutils.command.install_scripts import install_scripts + + +__app__ = "calculate-desktop" + +data_files = [] + +var_data_files = [] + +data_dirs_template = ['desktop-templates'] +data_dirs_share = ['i18n'] +share_calculate_dir = "/usr/share/calculate-2.2/" +template_calculate_dir = os.path.join(share_calculate_dir, "templates") + + +def __scanDir(scanDir, prefix, dirData, flagDir=False): + """Scan directory""" + files = [] + dirs = [] + if flagDir or stat.S_ISDIR(os.stat(scanDir)[stat.ST_MODE]): + for fileOrDir in os.listdir(scanDir): + absPath = os.path.join(scanDir,fileOrDir) + statInfo = os.stat(absPath)[stat.ST_MODE] + if stat.S_ISREG(statInfo): + files.append(absPath) + elif stat.S_ISDIR(statInfo): + dirs.append(absPath) + if prefix: + scanDir = os.path.join(prefix,scanDir) + dirData.append((scanDir, files)) + for sDir in dirs: + __scanDir(sDir, prefix, dirData, True) + return dirData + +def create_data_files(data_dirs, prefix=""): + """Create data_files""" + data_files = [] + for data_dir in data_dirs: + data = [] + data_files += __scanDir(data_dir, prefix, data) + return data_files + + +data_files += create_data_files (data_dirs_template, template_calculate_dir) +data_files += create_data_files (data_dirs_share, share_calculate_dir) +data_files += [('/usr/share/calculate-2.2/xdm', ['data/cmd_login', + 'data/functions', + 'data/gtkbg', + 'data/xdm'])] +\ + [('/etc/calculate/xdm/login.d', ['data/login.d/00init', + 'data/login.d/20desktop', + 'data/login.d/99final'])] +\ + [('/etc/calculate/xdm/logout.d', ['data/logout.d/00init'])] +\ + [('/var/calculate/templates', [])] + + +class cl_install_data(install_data): + def run (self): + install_data.run(self) + data_file = [("/usr/share/calculate-2.2/xdm/gtkbg",0755), + ("/usr/share/calculate-2.2/xdm/cmd_login",0755), + ("/usr/share/calculate-2.2/xdm/xdm",0755)] + fileNames = map(lambda x: os.path.split(x[0])[1], data_file) + listNames = map(lambda x: filter(lambda y: y, x[0].split("/")),data_file) + data_find = {} + for i in range(len(fileNames)): + listNames[i].reverse() + data_find[fileNames[i]] =[listNames[i],data_file[i][1]] + + for path in self.get_outputs(): + nameFile = os.path.split(path)[1] + if nameFile in data_find.keys(): + data = data_find[nameFile][0] + mode = data_find[nameFile][1] + flagFound = True + iMax = len(data) + pathFile = path + for i in range(iMax): + if data[i] != os.path.split(pathFile)[1]: + flagFound = False + break + pathFile = os.path.split(pathFile)[0] + if flagFound: + os.chmod(path, mode) + + +class cl_build_scripts(build_scripts): + """Class for build scripts""" + def run (self): + scripts = ['./scripts/install', './scripts/uninstall'] + backup_build_dir = self.build_dir + backup_scripts = filter(lambda x: not x in scripts, self.scripts) + self.scripts = scripts + self.build_dir = self.build_dir + "-bin" + build_scripts.run(self) + self.scripts = backup_scripts + self.build_dir = backup_build_dir + build_scripts.run(self) + + +class cl_install_scripts(install_scripts): + """Class for install scripts""" + def run (self): + backup_install_dir = self.install_dir + backup_build_dir = self.build_dir + cl_cmd_obj = self.distribution.get_command_obj("install") + self.build_dir = self.build_dir + "-bin" + self.install_dir = os.path.join(cl_cmd_obj.install_platlib, __app__, + "bin") + install_scripts.run(self) + self.build_dir = backup_build_dir + self.install_dir = backup_install_dir + install_scripts.run(self) + + +setup( + name = __app__, + version = "2.2.0", + description = "Create and configure user profile", + author = "Mir Calculate Ltd.", + author_email = "support@calculate.ru", + url = "http://calculate-linux.org", + license = "http://www.apache.org/licenses/LICENSE-2.0", + package_dir = {'calculate-desktop': "."}, + packages = ['calculate-desktop.pym'], + data_files = data_files, + scripts=["./scripts/cl-createhome-2.2", + "./scripts/install", + "./scripts/uninstall"], + cmdclass={'install_data': cl_install_data, + 'build_scripts':cl_build_scripts, + 'install_scripts':cl_install_scripts}, +)