diff --git a/connect.py b/connect.py
index d53c42fbe..2534c2fa9 100644
--- a/connect.py
+++ b/connect.py
@@ -24,11 +24,7 @@ from multiprocessing import Pool
os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings'
-<<<<<<< HEAD
-django.setup()
-=======
#django.setup()
->>>>>>> beta
from juser.models import User
from jlog.models import Log
diff --git a/docs/AddUserAsset.py b/docs/AddUserAsset.py
index a8ec01089..f8a5ed63c 100644
--- a/docs/AddUserAsset.py
+++ b/docs/AddUserAsset.py
@@ -7,11 +7,7 @@ import datetime
sys.path.append('../')
os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings'
-<<<<<<< HEAD
-django.setup()
-=======
#django.setup()
->>>>>>> beta
from juser.views import db_add_user, md5_crypt, CRYPTOR, db_add_group
@@ -103,11 +99,7 @@ def test_add_asset():
bis_group_all = BisGroup.objects.all()
dept_all = DEPT.objects.all()
for i in range(1, 500):
-<<<<<<< HEAD
- ip = '192.168.1.' + str(i)
-=======
ip = '192.168.5.' + str(i)
->>>>>>> beta
asset = Asset(ip=ip, port=22, login_type='L', idc=test_idc, is_active=True, comment='test')
asset.save()
asset.bis_group = [random.choice(bis_group_all) for i in range(2)]
@@ -136,15 +128,6 @@ def test_add_log():
if __name__ == '__main__':
#install()
-<<<<<<< HEAD
- test_add_dept()
- test_add_group()
- test_add_user()
- test_add_idc()
- test_add_asset_group()
- test_add_asset()
- test_add_log()
-=======
#test_add_dept()
#test_add_group()
#test_add_user()
@@ -152,7 +135,6 @@ if __name__ == '__main__':
#test_add_asset_group()
test_add_asset()
#test_add_log()
->>>>>>> beta
diff --git a/docs/install.py b/docs/install.py
index 732c22331..a032bf327 100644
--- a/docs/install.py
+++ b/docs/install.py
@@ -7,11 +7,7 @@ import datetime
sys.path.append('../')
os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings'
-<<<<<<< HEAD
-django.setup()
-=======
#django.setup()
->>>>>>> beta
from juser.views import db_add_user, md5_crypt, CRYPTOR, db_add_group
diff --git a/docs/require.txt b/docs/require.txt
deleted file mode 100644
index 85d351fe8..000000000
--- a/docs/require.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-pexpect==3.3
-sphinx-me==0.3
-django==1.6
-python-ldap==2.4.18
-paramiko==1.15.1
-pycrypto==2.6.1
-ecdsa>=0.11
-MySQL-python==1.2.5
-readline
-django-uuidfield
\ No newline at end of file
diff --git a/jumpserver/settings.py b/jumpserver/settings.py
index eb942a677..ce4d7e8b5 100644
--- a/jumpserver/settings.py
+++ b/jumpserver/settings.py
@@ -66,11 +66,7 @@ MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
-<<<<<<< HEAD
- 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
-=======
#'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
->>>>>>> beta
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
diff --git a/log_handler.py b/log_handler.py
index 50376656e..025d81ff4 100644
--- a/log_handler.py
+++ b/log_handler.py
@@ -10,11 +10,7 @@ from datetime import datetime
os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings'
import django
-<<<<<<< HEAD
-django.setup()
-=======
#django.setup()
->>>>>>> beta
from jlog.models import Log
diff --git a/ssh b/ssh
deleted file mode 100644
index 173fd3667..000000000
--- a/ssh
+++ /dev/null
@@ -1,395 +0,0 @@
-#!/usr/local/bin/python
-
-import socket
-import sys
-import os
-import ast
-import select
-import time
-from datetime import datetime
-import paramiko
-import struct
-import fcntl
-import signal
-import textwrap
-import django
-import getpass
-import fnmatch
-import optparse
-import readline
-from multiprocessing import Pool
-from ConfigParser import ConfigParser
-from django.core.exceptions import ObjectDoesNotExist
-
-os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings'
-django.setup()
-from juser.models import User
-from jasset.models import Asset
-from jlog.models import Log
-from jumpserver.views import PyCrypt
-from jumpserver.api import user_perm_asset_api, user_perm_group_api
-
-try:
- import termios
- import tty
-except ImportError:
- print '\033[1;31mOnly postfix supported.\033[0m'
- time.sleep(3)
- sys.exit()
-
-BASE_DIR = os.path.abspath(os.path.dirname(__file__))
-CONF = ConfigParser()
-CONF.read(os.path.join(BASE_DIR, 'jumpserver.conf'))
-LOG_DIR = os.path.join(BASE_DIR, 'logs')
-SSH_KEY_DIR = os.path.join(BASE_DIR, 'keys')
-SERVER_KEY_DIR = os.path.join(SSH_KEY_DIR, 'server')
-KEY = CONF.get('web', 'key')
-LOGIN_NAME = getpass.getuser()
-
-
-def color_print(msg, color='blue'):
- """Print colorful string."""
- color_msg = {'blue': '\033[1;36m%s\033[0m',
- 'green': '\033[1;32m%s\033[0m',
- 'red': '\033[1;31m%s\033[0m'}
-
- print color_msg.get(color, 'blue') % msg
-
-
-def color_print_exit(msg, color='red'):
- """Print colorful string and exit."""
- color_print(msg, color=color)
- time.sleep(2)
- sys.exit()
-
-
-class ServerError(Exception):
- pass
-
-
-def get_win_size():
- """This function use to get the size of the windows!"""
- if 'TIOCGWINSZ' in dir(termios):
- TIOCGWINSZ = termios.TIOCGWINSZ
- else:
- TIOCGWINSZ = 1074295912L # Assume
- s = struct.pack('HHHH', 0, 0, 0, 0)
- x = fcntl.ioctl(sys.stdout.fileno(), TIOCGWINSZ, s)
- return struct.unpack('HHHH', x)[0:2]
-
-
-def set_win_size(sig, data):
- """This function use to set the window size of the terminal!"""
- try:
- win_size = get_win_size()
- channel.resize_pty(height=win_size[0], width=win_size[1])
- except:
- pass
-
-
-def get_object(model, **kwargs):
- try:
- the_object = model.objects.get(**kwargs)
- except ObjectDoesNotExist:
- raise ServerError('Object get %s failed.' % str(kwargs.values()))
- return the_object
-
-
-def log_record(username, host):
- """Logging user command and output."""
- connect_log_dir = os.path.join(LOG_DIR, 'connect')
- timestamp_start = int(time.time())
- today = time.strftime('%Y%m%d', time.localtime(timestamp_start))
- time_now = time.strftime('%H%M%S', time.localtime(timestamp_start))
- today_connect_log_dir = os.path.join(connect_log_dir, today)
- log_filename = '%s_%s_%s.log' % (username, host, time_now)
- log_file_path = os.path.join(today_connect_log_dir, log_filename)
- pid = os.getpid()
- ip_list = []
- remote_ip = os.popen("who |grep `ps aux |gawk '{if ($2==%s) print $1}'` |gawk '{print $5}'|tr -d '()'" % pid).readlines()
- for ip in remote_ip:
- ip_list.append(ip.strip('\n'))
- ip_list = ','.join(list(set(ip_list)))
-
- if not os.path.isdir(today_connect_log_dir):
- try:
- os.makedirs(today_connect_log_dir)
- os.chmod(today_connect_log_dir, 0777)
- except OSError:
- raise ServerError('Create %s failed, Please modify %s permission.' % (today_connect_log_dir, connect_log_dir))
-
- try:
- log_file = open(log_file_path, 'a')
- except IOError:
- raise ServerError('Create logfile failed, Please modify %s permission.' % today_connect_log_dir)
-
- log = Log(user=username, host=host, remote_ip=ip_list, log_path=log_file_path, start_time=datetime.now(), pid=pid)
- log_file.write('Starttime is %s\n' % datetime.now())
- log.save()
- return log_file, log
-
-
-def posix_shell(chan, username, host):
- """
- Use paramiko channel connect server interactive.
- """
- log_file, log = log_record(username, host)
- old_tty = termios.tcgetattr(sys.stdin)
- try:
- tty.setraw(sys.stdin.fileno())
- tty.setcbreak(sys.stdin.fileno())
- chan.settimeout(0.0)
-
- while True:
- try:
- r, w, e = select.select([chan, sys.stdin], [], [])
- except:
- pass
-
- if chan in r:
- try:
- x = chan.recv(1024)
- if len(x) == 0:
- break
- sys.stdout.write(x)
- sys.stdout.flush()
- log_file.write(x)
- log_file.flush()
- except socket.timeout:
- pass
-
- if sys.stdin in r:
- x = os.read(sys.stdin.fileno(), 1)
- if len(x) == 0:
- break
- chan.send(x)
-
- finally:
- timestamp_end = time.time()
- termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_tty)
- log_file.write('Endtime is %s' % datetime.now())
- log_file.close()
- log.is_finished = True
- log.log_finished = False
- log.end_time = datetime.now()
- log.save()
-
-
-def get_user_host(username):
- """Get the hosts of under the user control."""
- hosts_attr = {}
- asset_all = user_perm_asset_api(username)
- for asset in asset_all:
- hosts_attr[asset.ip] = [asset.id, asset.comment]
- return hosts_attr
-
-
-def get_user_hostgroup(username):
- """Get the hostgroups of under the user control."""
- groups_attr = {}
- group_all = user_perm_group_api(username)
- for group in group_all:
- groups_attr[group.name] = [group.id, group.comment]
- return groups_attr
-
-
-def get_connect_item(username, ip):
- cryptor = PyCrypt(KEY)
-
- asset = get_object(Asset, ip=ip)
- port = asset.port
-
- if not asset.is_active:
- raise ServerError('Host %s is not active.' % ip)
-
- user = get_object(User, username=username)
-
- if not user.is_active:
- raise ServerError('User %s is not active.' % username)
-
- login_type_dict = {
- 'L': user.ldap_pwd,
- }
-
- if asset.login_type in login_type_dict:
- password = cryptor.decrypt(login_type_dict[asset.login_type])
- return username, password, ip, port
-
- elif asset.login_type == 'M':
- username = asset.username
- password = cryptor.decrypt(asset.password)
- return username, password, ip, port
-
- else:
- raise ServerError('Login type is not in ["L", "M"]')
-
-
-def verify_connect(username, part_ip):
- hosts_attr = get_user_host(username)
- hosts = hosts_attr.keys()
- ip_matched = [ip for ip in hosts if part_ip in ip]
-
- if len(ip_matched) > 1:
- for ip in ip_matched:
- print '%s -- %s' % (ip, hosts_attr[ip][1])
- elif len(ip_matched) < 1:
- color_print('No Permission or No host.', 'red')
- else:
- username, password, host, port = get_connect_item(username, ip_matched[0])
- print username, password, host, port
- connect(username, password, host, port, LOGIN_NAME)
-
-
-def print_prompt():
- msg = """\033[1;32m### Welcome Use JumpServer To Login. ### \033[0m
- 1) Type \033[32mIP ADDRESS\033[0m To Login.
- 2) Type \033[32mP/p\033[0m To Print The Servers You Available.
- 3) Type \033[32mG/g\033[0m To Print The Server Groups You Available.
- 4) Type \033[32mE/e\033[0m To Execute Command On Several Servers.
- 5) Type \033[32mQ/q\033[0m To Quit.
- """
- print textwrap.dedent(msg)
-
-
-def print_user_host(username):
- hosts_attr = get_user_host(username)
- hosts = hosts_attr.keys()
- hosts.sort()
- for ip in hosts:
- print '%s -- %s' % (ip, hosts_attr[ip][1])
-
-
-def print_user_hostgroup(username):
- group_attr = get_user_hostgroup(username)
- groups = group_attr.keys()
- for g in groups:
- print '%s -- %s' % (g, group_attr[g][1])
-
-
-def connect(username, password, host, port, login_name):
- """
- Connect server.
- """
- ps1 = "PS1='[\u@%s \W]\$ '\n" % host
- login_msg = "clear;echo -e '\\033[32mLogin %s done. Enjoy it.\\033[0m'\n" % host
-
- # Make a ssh connection
- ssh = paramiko.SSHClient()
- ssh.load_system_host_keys()
- ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- try:
- ssh.connect(host, port=port, username=username, password=password, compress=True)
- except paramiko.ssh_exception.AuthenticationException, paramiko.ssh_exception.SSHException:
- raise ServerError('Authentication Error.')
- except socket.error:
- raise ServerError('Connect SSH Socket Port Error, Please Correct it.')
-
- # Make a channel and set windows size
- global channel
- win_size = get_win_size()
- channel = ssh.invoke_shell(height=win_size[0], width=win_size[1])
- #channel.resize_pty(height=win_size[0], width=win_size[1])
- try:
- signal.signal(signal.SIGWINCH, set_win_size)
- except:
- pass
-
- # Set PS1 and msg it
- channel.send(ps1)
- channel.send(login_msg)
-
- # Make ssh interactive tunnel
- posix_shell(channel, login_name, host)
-
- # Shutdown channel socket
- channel.close()
- ssh.close()
-
-
-def remote_exec_cmd(ip, port, username, password, cmd):
- try:
- time.sleep(5)
- ssh = paramiko.SSHClient()
- ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- ssh.connect(ip, port, username, password, timeout=5)
- stdin, stdout, stderr = ssh.exec_command("bash -l -c '%s'" % cmd)
- out = stdout.readlines()
- err = stderr.readlines()
- color_print('%s:' %ip, 'blue')
- for i in out:
- color_print(" " * 4 + i.strip(), 'green')
- for j in err:
- color_print(" " * 4 + j.strip(), 'red')
- ssh.close()
- except Exception as e:
- color_print(ip + ':', 'blue')
- color_print(str(e), 'red')
-
-
-def multi_remote_exec_cmd(hosts, username, cmd):
- pool = Pool(processes=5)
- for host in hosts:
- username, password, ip, port = get_connect_item(username, host)
- pool.apply_async(remote_exec_cmd, (ip, port, username, password, cmd))
- pool.close()
- pool.join()
-
-
-def exec_cmd_servers(username):
- hosts = []
- color_print("Input the Host IP(s),Separated by Commas, q/Q to Quit.\n \
- You can choose in the following IP(s), Use Linux / Unix glob.", 'green')
- print_user_host(LOGIN_NAME)
- while True:
- inputs = raw_input('\033[1;32mip(s)>: \033[0m')
- if inputs in ['q', 'Q']:
- break
- get_hosts = get_user_host(username).keys()
- for host in get_hosts:
- if fnmatch.fnmatch(host, inputs):
- hosts.append(host.strip())
- if len(hosts) == 0:
- color_print("Check again, Not matched any ip!", 'red')
- continue
- else:
- print "You matched ip: %s" % hosts
- color_print("Input the Command , The command will be Execute on servers, q/Q to quit.", 'green')
- while True:
- cmd = raw_input('\033[1;32mCmd(s): \033[0m')
- if cmd in ['q', 'Q']:
- break
- exec_log_dir = os.path.join(LOG_DIR, 'exec_cmds')
- if not os.path.isdir(exec_log_dir):
- os.mkdir(exec_log_dir)
- os.chmod(exec_log_dir, 0777)
- filename = "%s/%s.log" % (exec_log_dir, time.strftime('%Y%m%d'))
- f = open(filename, 'a')
- f.write("DateTime: %s User: %s Host: %s Cmds: %s\n" %
- (time.strftime('%Y/%m/%d %H:%M:%S'), username, hosts, cmd))
- multi_remote_exec_cmd(hosts, username, cmd)
-
-
-def help():
- global p, options, arguments
- usage = "usage: %prog '' [options] arg1 [options] arg2"
- p = optparse.OptionParser(usage=usage)
- p.add_option('-p', '--host', help = "Print The Servers You Available.")
- p.add_option('-g', '--group', help = "Print The Server Groups You Available.")
- options, arguments = p.parse_args()
-
-
-def main():
- help()
- if options.host:
- pass
- elif options.group:
- pass
- else:
- try:
- verify_connect(LOGIN_NAME, sys.argv[1])
- except ServerError, e:
- color_print(e, 'red')
-
-
-if __name__ == '__main__':
- main()
diff --git a/ssh.py b/ssh.py
deleted file mode 100644
index 57836735b..000000000
--- a/ssh.py
+++ /dev/null
@@ -1,395 +0,0 @@
-#!/usr/bin/env python
-
-import socket
-import sys
-import os
-import ast
-import select
-import time
-from datetime import datetime
-import paramiko
-import struct
-import fcntl
-import signal
-import textwrap
-import django
-import getpass
-import fnmatch
-import optparse
-import readline
-from multiprocessing import Pool
-from ConfigParser import ConfigParser
-from django.core.exceptions import ObjectDoesNotExist
-
-os.environ['DJANGO_SETTINGS_MODULE'] = 'jumpserver.settings'
-django.setup()
-from juser.models import User
-from jasset.models import Asset
-from jlog.models import Log
-from jumpserver.views import PyCrypt
-from jumpserver.api import user_perm_asset_api, user_perm_group_api
-
-try:
- import termios
- import tty
-except ImportError:
- print '\033[1;31mOnly postfix supported.\033[0m'
- time.sleep(3)
- sys.exit()
-
-BASE_DIR = os.path.abspath(os.path.dirname(__file__))
-CONF = ConfigParser()
-CONF.read(os.path.join(BASE_DIR, 'jumpserver.conf'))
-LOG_DIR = os.path.join(BASE_DIR, 'logs')
-SSH_KEY_DIR = os.path.join(BASE_DIR, 'keys')
-SERVER_KEY_DIR = os.path.join(SSH_KEY_DIR, 'server')
-KEY = CONF.get('web', 'key')
-LOGIN_NAME = getpass.getuser()
-
-
-def color_print(msg, color='blue'):
- """Print colorful string."""
- color_msg = {'blue': '\033[1;36m%s\033[0m',
- 'green': '\033[1;32m%s\033[0m',
- 'red': '\033[1;31m%s\033[0m'}
-
- print color_msg.get(color, 'blue') % msg
-
-
-def color_print_exit(msg, color='red'):
- """Print colorful string and exit."""
- color_print(msg, color=color)
- time.sleep(2)
- sys.exit()
-
-
-class ServerError(Exception):
- pass
-
-
-def get_win_size():
- """This function use to get the size of the windows!"""
- if 'TIOCGWINSZ' in dir(termios):
- TIOCGWINSZ = termios.TIOCGWINSZ
- else:
- TIOCGWINSZ = 1074295912L # Assume
- s = struct.pack('HHHH', 0, 0, 0, 0)
- x = fcntl.ioctl(sys.stdout.fileno(), TIOCGWINSZ, s)
- return struct.unpack('HHHH', x)[0:2]
-
-
-def set_win_size(sig, data):
- """This function use to set the window size of the terminal!"""
- try:
- win_size = get_win_size()
- channel.resize_pty(height=win_size[0], width=win_size[1])
- except:
- pass
-
-
-def get_object(model, **kwargs):
- try:
- the_object = model.objects.get(**kwargs)
- except ObjectDoesNotExist:
- raise ServerError('Object get %s failed.' % str(kwargs.values()))
- return the_object
-
-
-def log_record(username, host):
- """Logging user command and output."""
- connect_log_dir = os.path.join(LOG_DIR, 'connect')
- timestamp_start = int(time.time())
- today = time.strftime('%Y%m%d', time.localtime(timestamp_start))
- time_now = time.strftime('%H%M%S', time.localtime(timestamp_start))
- today_connect_log_dir = os.path.join(connect_log_dir, today)
- log_filename = '%s_%s_%s.log' % (username, host, time_now)
- log_file_path = os.path.join(today_connect_log_dir, log_filename)
- pid = os.getpid()
- ip_list = []
- remote_ip = os.popen("who |grep `ps aux |gawk '{if ($2==%s) print $1}'` |gawk '{print $5}'|tr -d '()'" % pid).readlines()
- for ip in remote_ip:
- ip_list.append(ip.strip('\n'))
- ip_list = ','.join(list(set(ip_list)))
-
- if not os.path.isdir(today_connect_log_dir):
- try:
- os.makedirs(today_connect_log_dir)
- os.chmod(today_connect_log_dir, 0777)
- except OSError:
- raise ServerError('Create %s failed, Please modify %s permission.' % (today_connect_log_dir, connect_log_dir))
-
- try:
- log_file = open(log_file_path, 'a')
- except IOError:
- raise ServerError('Create logfile failed, Please modify %s permission.' % today_connect_log_dir)
-
- log = Log(user=username, host=host, remote_ip=ip_list, log_path=log_file_path, start_time=datetime.now(), pid=pid)
- log_file.write('Starttime is %s\n' % datetime.now())
- log.save()
- return log_file, log
-
-
-def posix_shell(chan, username, host):
- """
- Use paramiko channel connect server interactive.
- """
- log_file, log = log_record(username, host)
- old_tty = termios.tcgetattr(sys.stdin)
- try:
- tty.setraw(sys.stdin.fileno())
- tty.setcbreak(sys.stdin.fileno())
- chan.settimeout(0.0)
-
- while True:
- try:
- r, w, e = select.select([chan, sys.stdin], [], [])
- except:
- pass
-
- if chan in r:
- try:
- x = chan.recv(1024)
- if len(x) == 0:
- break
- sys.stdout.write(x)
- sys.stdout.flush()
- log_file.write(x)
- log_file.flush()
- except socket.timeout:
- pass
-
- if sys.stdin in r:
- x = os.read(sys.stdin.fileno(), 1)
- if len(x) == 0:
- break
- chan.send(x)
-
- finally:
- timestamp_end = time.time()
- termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_tty)
- log_file.write('Endtime is %s' % datetime.now())
- log_file.close()
- log.is_finished = True
- log.log_finished = False
- log.end_time = datetime.now()
- log.save()
-
-
-def get_user_host(username):
- """Get the hosts of under the user control."""
- hosts_attr = {}
- asset_all = user_perm_asset_api(username)
- for asset in asset_all:
- hosts_attr[asset.ip] = [asset.id, asset.comment]
- return hosts_attr
-
-
-def get_user_hostgroup(username):
- """Get the hostgroups of under the user control."""
- groups_attr = {}
- group_all = user_perm_group_api(username)
- for group in group_all:
- groups_attr[group.name] = [group.id, group.comment]
- return groups_attr
-
-
-def get_connect_item(username, ip):
- cryptor = PyCrypt(KEY)
-
- asset = get_object(Asset, ip=ip)
- port = asset.port
-
- if not asset.is_active:
- raise ServerError('Host %s is not active.' % ip)
-
- user = get_object(User, username=username)
-
- if not user.is_active:
- raise ServerError('User %s is not active.' % username)
-
- login_type_dict = {
- 'L': user.ldap_pwd,
- }
-
- if asset.login_type in login_type_dict:
- password = cryptor.decrypt(login_type_dict[asset.login_type])
- return username, password, ip, port
-
- elif asset.login_type == 'M':
- username = asset.username
- password = cryptor.decrypt(asset.password)
- return username, password, ip, port
-
- else:
- raise ServerError('Login type is not in ["L", "M"]')
-
-
-def verify_connect(username, part_ip):
- hosts_attr = get_user_host(username)
- hosts = hosts_attr.keys()
- ip_matched = [ip for ip in hosts if part_ip in ip]
-
- if len(ip_matched) > 1:
- for ip in ip_matched:
- print '%s -- %s' % (ip, hosts_attr[ip][1])
- elif len(ip_matched) < 1:
- color_print('No Permission or No host.', 'red')
- else:
- username, password, host, port = get_connect_item(username, ip_matched[0])
- print username, password, host, port
- connect(username, password, host, port, LOGIN_NAME)
-
-
-def print_prompt():
- msg = """\033[1;32m### Welcome Use JumpServer To Login. ### \033[0m
- 1) Type \033[32mIP ADDRESS\033[0m To Login.
- 2) Type \033[32mP/p\033[0m To Print The Servers You Available.
- 3) Type \033[32mG/g\033[0m To Print The Server Groups You Available.
- 4) Type \033[32mE/e\033[0m To Execute Command On Several Servers.
- 5) Type \033[32mQ/q\033[0m To Quit.
- """
- print textwrap.dedent(msg)
-
-
-def print_user_host(username):
- hosts_attr = get_user_host(username)
- hosts = hosts_attr.keys()
- hosts.sort()
- for ip in hosts:
- print '%s -- %s' % (ip, hosts_attr[ip][1])
-
-
-def print_user_hostgroup(username):
- group_attr = get_user_hostgroup(username)
- groups = group_attr.keys()
- for g in groups:
- print '%s -- %s' % (g, group_attr[g][1])
-
-
-def connect(username, password, host, port, login_name):
- """
- Connect server.
- """
- ps1 = "PS1='[\u@%s \W]\$ '\n" % host
- login_msg = "clear;echo -e '\\033[32mLogin %s done. Enjoy it.\\033[0m'\n" % host
-
- # Make a ssh connection
- ssh = paramiko.SSHClient()
- ssh.load_system_host_keys()
- ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- try:
- ssh.connect(host, port=port, username=username, password=password, compress=True)
- except paramiko.ssh_exception.AuthenticationException, paramiko.ssh_exception.SSHException:
- raise ServerError('Authentication Error.')
- except socket.error:
- raise ServerError('Connect SSH Socket Port Error, Please Correct it.')
-
- # Make a channel and set windows size
- global channel
- win_size = get_win_size()
- channel = ssh.invoke_shell(height=win_size[0], width=win_size[1])
- #channel.resize_pty(height=win_size[0], width=win_size[1])
- try:
- signal.signal(signal.SIGWINCH, set_win_size)
- except:
- pass
-
- # Set PS1 and msg it
- channel.send(ps1)
- channel.send(login_msg)
-
- # Make ssh interactive tunnel
- posix_shell(channel, login_name, host)
-
- # Shutdown channel socket
- channel.close()
- ssh.close()
-
-
-def remote_exec_cmd(ip, port, username, password, cmd):
- try:
- time.sleep(5)
- ssh = paramiko.SSHClient()
- ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- ssh.connect(ip, port, username, password, timeout=5)
- stdin, stdout, stderr = ssh.exec_command("bash -l -c '%s'" % cmd)
- out = stdout.readlines()
- err = stderr.readlines()
- color_print('%s:' %ip, 'blue')
- for i in out:
- color_print(" " * 4 + i.strip(), 'green')
- for j in err:
- color_print(" " * 4 + j.strip(), 'red')
- ssh.close()
- except Exception as e:
- color_print(ip + ':', 'blue')
- color_print(str(e), 'red')
-
-
-def multi_remote_exec_cmd(hosts, username, cmd):
- pool = Pool(processes=5)
- for host in hosts:
- username, password, ip, port = get_connect_item(username, host)
- pool.apply_async(remote_exec_cmd, (ip, port, username, password, cmd))
- pool.close()
- pool.join()
-
-
-def exec_cmd_servers(username):
- hosts = []
- color_print("Input the Host IP(s),Separated by Commas, q/Q to Quit.\n \
- You can choose in the following IP(s), Use Linux / Unix glob.", 'green')
- print_user_host(LOGIN_NAME)
- while True:
- inputs = raw_input('\033[1;32mip(s)>: \033[0m')
- if inputs in ['q', 'Q']:
- break
- get_hosts = get_user_host(username).keys()
- for host in get_hosts:
- if fnmatch.fnmatch(host, inputs):
- hosts.append(host.strip())
- if len(hosts) == 0:
- color_print("Check again, Not matched any ip!", 'red')
- continue
- else:
- print "You matched ip: %s" % hosts
- color_print("Input the Command , The command will be Execute on servers, q/Q to quit.", 'green')
- while True:
- cmd = raw_input('\033[1;32mCmd(s): \033[0m')
- if cmd in ['q', 'Q']:
- break
- exec_log_dir = os.path.join(LOG_DIR, 'exec_cmds')
- if not os.path.isdir(exec_log_dir):
- os.mkdir(exec_log_dir)
- os.chmod(exec_log_dir, 0777)
- filename = "%s/%s.log" % (exec_log_dir, time.strftime('%Y%m%d'))
- f = open(filename, 'a')
- f.write("DateTime: %s User: %s Host: %s Cmds: %s\n" %
- (time.strftime('%Y/%m/%d %H:%M:%S'), username, hosts, cmd))
- multi_remote_exec_cmd(hosts, username, cmd)
-
-
-def help():
- global p, options, arguments
- usage = "usage: %prog '' [options] arg1 [options] arg2"
- p = optparse.OptionParser(usage=usage)
- p.add_option('-p', '--host', help = "Print The Servers You Available.")
- p.add_option('-g', '--group', help = "Print The Server Groups You Available.")
- options, arguments = p.parse_args()
-
-
-def main():
- help()
- if options.host:
- pass
- elif options.group:
- pass
- else:
- try:
- verify_connect(LOGIN_NAME, sys.argv[1])
- except ServerError, e:
- color_print(e, 'red')
-
-
-if __name__ == '__main__':
- main()
diff --git a/static/js/layer/extend/layer.ext.js b/static/js/layer/extend/layer.ext.js
index 92fc72d25..2b3a23b4e 100644
--- a/static/js/layer/extend/layer.ext.js
+++ b/static/js/layer/extend/layer.ext.js
@@ -1,4 +1,3 @@
-<<<<<<< HEAD
/**
@Name: layer拓展类,依赖于layer
@@ -10,17 +9,4 @@
*/
-=======
-/**
-
- @Name: layer拓展类,依赖于layer
- @Date: 2014.08.13
- @Author: 贤心
- @Versions:1.8.5-ext
- @Api:http://sentsin.com/jquery/layer
- @Desc: 本拓展会持续更新
-
- */
-
->>>>>>> beta
layer.use("skin/layer.ext.css",function(){layer.ext&&layer.ext()}),layer.prompt=function(a,b,c){var d={},a=a||{},e={area:["auto","auto"],offset:[a.top||"",""],title:a.title||"信息",dialog:{btns:2,type:-1,msg:'',yes:function(c){var e=d.prompt.val();""===e?d.prompt.focus():e.replace(/\s/g,"").length>(a.length||1e3)?layer.tips("最多输入"+(a.length||1e3)+"个字数","#xubox_prompt",2):b&&b(e,c,d.prompt)},no:c},success:function(){d.prompt=$("#xubox_prompt"),d.prompt.focus()}};return 3===a.type&&(e.dialog.msg='"),$.layer(e)},layer.tab=function(a){var a=a||{},c=a.data||[],d={type:1,border:[0],area:["auto","auto"],bgcolor:"",title:!1,shade:a.shade,offset:a.offset,move:".xubox_tabmove",closeBtn:!1,page:{html:'
'}()+'
'+'
'+function(){var a=c.length,b=1,d="";if(a>0)for(d=''+c[0].title+"";a>b;b++)d+=""+c[b].title+"";return d}()+"
"+'
'+function(){var a=c.length,b=1,d="";if(a>0)for(d='- '+(c[0].content||"content未传入")+"
";a>b;b++)d+='- '+(c[b].content||"content未传入")+"
";return d}()+"
"+'
X'+"
"},success:function(a){var b=$(".xubox_tabtit").children(),c=$(".xubox_tab_main").children(),d=$(".xubox_tabclose");b.on("click",function(){var a=$(this),b=a.index();a.addClass("xubox_tabnow").siblings().removeClass("xubox_tabnow"),c.eq(b).show().siblings().hide()}),d.on("click",function(){layer.close(a.attr("times"))})}};return $.layer(d)},layer.photos=function(a){var b,c,d,e,f,g,h,i;if(a=a||{},b={imgIndex:1,end:null,html:$("html")},c=$(window),d=a.json,e=a.page,d){if(f=d.data,1!==d.status)return layer.msg("未请求到数据",2,8),void 0;if(b.imgLen=f.length,!(f.length>0))return layer.msg("没有任何图片",2,8),void 0;b.thissrc=f[d.start].src,b.pid=f[d.start].pid,b.imgsname=d.title||"",b.name=f[d.start].name,b.imgIndex=d.start+1}else g=$(e.parent).find("img"),h=g.eq(e.start),b.thissrc=h.attr("layer-img")||h.attr("src"),b.pid=h.attr("pid"),b.imgLen=g.length,b.imgsname=e.title||"",b.name=h.attr("alt"),b.imgIndex=e.start+1;return i={type:1,border:[0],area:[(a.html?915:600)+"px","auto"],title:!1,shade:[.9,"#000",!0],shadeClose:!0,offset:["25px",""],bgcolor:"",page:{html:''+function(){return b.imgLen>1?'
':""}()+'
"+function(){return a.html?''+a.html+"
":""}()},success:function(a){b.bigimg=a.find(".xubox_bigimg"),b.imgsee=b.bigimg.find(".xubox_imgsee"),b.imgbar=b.imgsee.find(".xubox_imgbar"),b.imgtit=b.imgbar.find(".xubox_imgtit"),b.layero=a;var c=b.imgs=b.bigimg.find("img");clearTimeout(b.timerr),b.timerr=setTimeout(function(){$("html").css("overflow","hidden").attr("layer-full",b.index)},10),c.load(function(){b.imgarea=[c.outerWidth(),c.outerHeight()],b.resize(a)}),b.event()},end:function(){layer.closeAll(),b.end=!0}},b.event=function(){b.bigimg.hover(function(){b.imgsee.show()},function(){b.imgsee.hide()}),i.imgprev=function(){b.imgIndex--,b.imgIndex<1&&(b.imgIndex=b.imgLen),b.tabimg()},b.bigimg.find(".xubox_prev").on("click",function(a){a.preventDefault(),i.imgprev()}),i.imgnext=function(){b.imgIndex++,b.imgIndex>b.imgLen&&(b.imgIndex=1),b.tabimg()},b.bigimg.find(".xubox_next").on("click",function(a){a.preventDefault(),i.imgnext()}),$(document).keyup(function(a){if(!b.end){var c=a.keyCode;a.preventDefault(),37===c?i.imgprev():39===c?i.imgnext():27===c&&layer.close(b.index)}}),b.tabimg=function(){var e,h,i,j,k;b.imgs.removeAttr("style"),d?(j=f[b.imgIndex-1],e=j.src,h=j.pid,i=j.name):(k=g.eq(b.imgIndex-1),e=k.attr("layer-img")||k.attr("src"),h=k.attr("layer-pid")||"",i=k.attr("alt")||""),b.imgs.attr({src:e,"layer-pid":h,alt:i}),b.imgtit.find("em").text(b.imgIndex+"/"+b.imgLen),b.imgsee.show(),a.tab&&a.tab({pid:h,name:i})}},b.resize=function(d){var g,e={},f=[c.width(),c.height()];e.limit=f[0]-f[0]/f[1]*(60*f[0]/f[1]),e.limit<600&&(e.limit=600),g=[e.limit,f[1]>400?f[1]-50:400],g[0]=a.html?g[0]:g[0]-300,layer.area(b.index,{width:g[0]+(a.html?15:0),height:g[1]}),e.flwidth=g[0]-(a.html?300:0),b.imgarea[0]>e.flwidth?b.imgs.css({width:e.flwidth}):b.imgs.css({width:b.imgarea[0]}),b.imgs.outerHeight()>>>>>> beta
f={getPath:function(){var a=document.scripts,b=a[a.length-1].src;return e?e:b.substring(0,b.lastIndexOf("/")+1)},type:["dialog","page","iframe","loading","tips"]};a.layer={v:"1.8.5",ie6:!!a.ActiveXObject&&!a.XMLHttpRequest,index:0,path:f.getPath(),use:function(a,b){var d=c("head")[0],a=a.replace(/\s/g,""),e=/\.css$/.test(a),f=document.createElement(e?"link":"script"),g=a.replace(/\.|\//g,"");e&&(f.type="text/css",f.rel="stylesheet"),f[e?"href":"src"]=/^http:\/\//.test(a)?a:layer.path+a,f.id=g,c("#"+g)[0]||d.appendChild(f),b&&(document.all?c(f).ready(b):c(f).load(b))},alert:function(a,b,d,e){var f="function"==typeof d,g={dialog:{msg:a,type:b,yes:f?d:e},area:["auto","auto"]};return f||(g.title=d),c.layer(g)},confirm:function(a,b,d,e){var f="function"==typeof d,g={dialog:{msg:a,type:4,btns:2,yes:b,no:f?d:e}};return f||(g.title=d),c.layer(g)},msg:function(a,d,e,f){var g={title:!1,closeBtn:!1,time:d===b?2:d,dialog:{msg:""===a||a===b?" ":a},end:f};return"object"==typeof e?(g.dialog.type=e.type,g.shade=e.shade,g.shift=e.rate):"function"==typeof e?g.end=e:g.dialog.type=e,c.layer(g)},load:function(a,b){return"string"==typeof a?layer.msg(a,b||0,16):c.layer({time:a,loading:{type:b},bgcolor:b?"#fff":"",shade:b?[.1,"#000"]:[0],border:3!==b&&b?[6,.3,"#000"]:[0],type:3,title:["",!1],closeBtn:[0,!1]})},tips:function(a,b,d,e,f,g){var h={type:4,shade:!1,success:function(a){this.closeBtn||a.find(".xubox_tips").css({"padding-right":10})},bgcolor:"",tips:{msg:a,follow:b}};return h.time="object"==typeof d?d.time:0|d,d=d||{},h.closeBtn=d.closeBtn||!1,h.maxWidth=d.maxWidth||e,h.tips.guide=d.guide||f,h.tips.style=d.style||g,h.tips.more=d.more,c.layer(h)}};var g=["xubox_layer","xubox_iframe",".xubox_title",".xubox_text",".xubox_page",".xubox_main"],h=function(a){var b=this,d=b.config;layer.index++,b.index=layer.index,b.config=c.extend({},d,a),b.config.dialog=c.extend({},d.dialog,a.dialog),b.config.page=c.extend({},d.page,a.page),b.config.iframe=c.extend({},d.iframe,a.iframe),b.config.loading=c.extend({},d.loading,a.loading),b.config.tips=c.extend({},d.tips,a.tips),b.creat()};h.pt=h.prototype,h.pt.config={type:0,shade:[.3,"#000"],fix:!0,move:".xubox_title",title:"信息",offset:["","50%"],area:["310px","auto"],closeBtn:[0,!0],time:0,bgcolor:"#fff",border:[6,.3,"#000"],zIndex:19891014,maxWidth:400,dialog:{btns:1,btn:["确定","取消"],type:8,msg:"",yes:function(a){layer.close(a)},no:function(a){layer.close(a)}},page:{dom:"#xulayer",html:"",url:""},iframe:{src:"http://sentsin.com",scrolling:"auto"},loading:{type:0},tips:{msg:"",follow:"",guide:0,isGuide:!0,style:["background-color:#FF9900; color:#fff;","#FF9900"]},success:function(){},close:function(a){layer.close(a)},end:function(){}},h.pt.space=function(a){var b=this,a=a||"",c=b.index,d=b.config,e=d.dialog,f=-1===e.type?"":'',h=[''+f+''+e.msg+"
",''+a+"
",'','',''],i="",j="",k=d.zIndex+c,l="z-index:"+k+"; background-color:"+d.shade[1]+"; opacity:"+d.shade[0]+"; filter:alpha(opacity="+100*d.shade[0]+");";d.shade[0]&&(i=''),d.zIndex=k;var m="",n="",o="z-index:"+(k-1)+"; background-color: "+d.border[2]+"; opacity:"+d.border[1]+"; filter:alpha(opacity="+100*d.border[1]+"); top:-"+d.border[0]+"px; left:-"+d.border[0]+"px;";d.border[0]&&(j=''),!d.maxmin||1!==d.type&&2!==d.type||/^\d+%$/.test(d.area[0])&&/^\d+%$/.test(d.area[1])||(n=''),d.closeBtn[1]&&(n+='');var p="object"==typeof d.title;return d.title&&(m=''+(p?d.title[0]:d.title)+"
"),[i,''+h[d.type]+m+''+n+'
'+j+"
"]},h.pt.creat=function(){var a=this,b="",d=a.config,e=d.dialog,f=a.index,h=d.page,i=c("body"),j=function(d){var d=d||"";b=a.space(d),i.append(c(b[0]))};switch(d.type){case 0:d.title||(d.area=["auto","auto"]),c(".xubox_dialog")[0]&&layer.close(c(".xubox_dialog").parents("."+g[0]).attr("times"));break;case 1:if(""!==h.html)j(''+h.html+"
"),i.append(c(b[1]));else if(""!==h.url)j(''+h.html+"
"),i.append(c(b[1])),c.get(h.url,function(a){c("#xuboxPageHtml"+f).html(a.toString()),h.ok&&h.ok(a)});else{if(0!=c(h.dom).parents(g[4]).length)return;j(),c(h.dom).show().wrap(c(b[1]))}break;case 3:d.title=!1,d.area=["auto","auto"],d.closeBtn=["",!1],c(".xubox_loading")[0]&&layer.closeLoad();break;case 4:d.title=!1,d.area=["auto","auto"],d.fix=!1,d.border=[0],d.tips.more||layer.closeTips()}1!==d.type&&(j(),i.append(c(b[1])));var k=a.layerE=c("#"+g[0]+f);if(k.css({width:d.area[0],height:d.area[1]}),d.fix||k.css({position:"absolute"}),d.title&&(3!==d.type||4!==d.type)){var l=0===d.type?e:d,m=k.find(".xubox_botton");switch(l.btn=d.btn||e.btn,l.btns){case 0:m.html("").hide();break;case 1:m.html(''+l.btn[0]+"");break;case 2:m.html(''+l.btn[0]+''+l.btn[1]+"")}}"auto"===k.css("left")?(k.hide(),setTimeout(function(){k.show(),a.set(f)},500)):a.set(f),d.time<=0||a.autoclose(),a.callback()},f.fade=function(a,b,c){a.css({opacity:0}).animate({opacity:c},b)},h.pt.offset=function(){var a=this,b=a.config,c=a.layerE,e=c.outerHeight();a.offsetTop=""===b.offset[0]&&ee.maxWidth&&i.width(e.maxWidth),o.tipColor=e.tips.style[1],m[0]=i.outerWidth(),o.autoLeft=function(){o.left+m[0]-d.width()>0?(o.tipLeft=o.left+o.width-m[0],p.css({right:12,left:"auto"})):o.tipLeft=o.left},o.where=[function(){o.autoLeft(),o.tipTop=o.top-m[1]-10,p.removeClass("layerTipsB").addClass("layerTipsT").css({"border-right-color":o.tipColor})},function(){o.tipLeft=o.left+o.width+10,o.tipTop=o.top,p.removeClass("layerTipsL").addClass("layerTipsR").css({"border-bottom-color":o.tipColor})},function(){o.autoLeft(),o.tipTop=o.top+o.height+10,p.removeClass("layerTipsT").addClass("layerTipsB").css({"border-right-color":o.tipColor})},function(){o.tipLeft=o.left-m[0]+10,o.tipTop=o.top,p.removeClass("layerTipsR").addClass("layerTipsL").css({"border-bottom-color":o.tipColor})}],o.where[e.tips.guide](),0===e.tips.guide?o.top-(d.scrollTop()+m[1]+16)<0&&o.where[2]():1===e.tips.guide?d.width()-(o.left+o.width+m[0]+16)>0||o.where[3]():2===e.tips.guide?o.top-d.scrollTop()+o.height+m[1]+16-d.height()>0&&o.where[0]():3===e.tips.guide?m[0]+16-o.left>0&&o.where[1]():4===e.tips.guide,i.css({left:o.tipLeft,top:o.tipTop})}e.fadeIn&&(f.fade(i,e.fadeIn,1),f.fade(c("#xubox_shade"+a),e.fadeIn,e.shade[0])),e.fix&&""===e.offset[0]&&!e.shift&&d.on("resize",function(){i.css({top:(d.height()-i.outerHeight())/2})}),b.move()},h.pt.shift=function(a,b,c){var e=this,f=e.config,g=e.layerE,h=0,i=d.width(),j=d.height()+(f.fix?0:d.scrollTop());h="50%"==f.offset[1]||""==f.offset[1]?g.outerWidth()/2:g.outerWidth();var k={t:{top:e.offsetTop},b:{top:j-g.outerHeight()-f.border[0]},cl:h+f.border[0],ct:-g.outerHeight(),cr:i-h-f.border[0]};switch(a){case"left-top":g.css({left:k.cl,top:k.ct}).animate(k.t,b);break;case"top":g.css({top:k.ct}).animate(k.t,b);break;case"right-top":g.css({left:k.cr,top:k.ct}).animate(k.t,b);break;case"right-bottom":g.css({left:k.cr,top:j}).animate(c?k.t:k.b,b);break;case"bottom":g.css({top:j}).animate(c?k.t:k.b,b);break;case"left-bottom":g.css({left:k.cl,top:j}).animate(c?k.t:k.b,b);break;case"left":g.css({left:-g.outerWidth()}).animate({left:e.offsetLeft},b)}},h.pt.autoArea=function(a){var b,d=this,a=a||d.index,e=d.config,f=e.page,h=c("#"+g[0]+a),i=h.find(g[2]),j=h.find(g[5]),k=e.title?i.innerHeight():0,l=0;switch("auto"===e.area[0]&&j.outerWidth()>=e.maxWidth&&h.css({width:e.maxWidth}),e.type){case 0:var m=h.find(".xubox_botton>a");b=h.find(g[3]).outerHeight()+20,m.length>0&&(l=m.outerHeight()+20);break;case 1:var n=h.find(g[4]);b=c(f.dom).outerHeight(),"auto"===e.area[0]&&h.css({width:n.outerWidth()}),(""!==f.html||""!==f.url)&&(b=n.outerHeight());break;case 2:h.find("iframe").css({width:h.outerWidth(),height:h.outerHeight()-(e.title?i.innerHeight():0)});break;case 3:var o=h.find(".xubox_loading");b=o.outerHeight(),j.css({width:o.width()})}"auto"===e.area[1]&&j.css({height:k+b+l}),c("#xubox_border"+a).css({width:h.outerWidth()+2*e.border[0],height:h.outerHeight()+2*e.border[0]}),layer.ie6&&"auto"!==e.area[0]&&j.css({width:h.outerWidth()}),h.css("50%"!==e.offset[1]&&""!=e.offset[1]||4===e.type?{marginLeft:0}:{marginLeft:-h.outerWidth()/2})},h.pt.move=function(){var a=this,b=a.config,e={setY:0,moveLayer:function(){if(0==parseInt(e.layerE.css("margin-left")))var a=parseInt(e.move.css("left"));else var a=parseInt(e.move.css("left"))+-parseInt(e.layerE.css("margin-left"));"fixed"!==e.layerE.css("position")&&(a-=e.layerE.parent().offset().left,e.setY=0),e.layerE.css({left:a,top:parseInt(e.move.css("top"))-e.setY})}},f=a.layerE.find(b.move);b.move&&f.attr("move","ok"),f.css(b.move?{cursor:"move"}:{cursor:"auto"}),c(b.move).on("mousedown",function(a){if(a.preventDefault(),"ok"===c(this).attr("move")){e.ismove=!0,e.layerE=c(this).parents("."+g[0]);var f=e.layerE.offset().left,h=e.layerE.offset().top,i=e.layerE.width()-6,j=e.layerE.height()-6;c("#xubox_moves")[0]||c("body").append(''),e.move=c("#xubox_moves"),b.moveType&&e.move.css({opacity:0}),e.moveX=a.pageX-e.move.position().left,e.moveY=a.pageY-e.move.position().top,"fixed"!==e.layerE.css("position")||(e.setY=d.scrollTop())}}),c(document).mousemove(function(a){if(e.ismove){var c=a.pageX-e.moveX,f=a.pageY-e.moveY;if(a.preventDefault(),!b.moveOut){e.setY=d.scrollTop();var g=d.width()-e.move.outerWidth()-b.border[0],h=b.border[0]+e.setY;cg&&(c=g),h>f&&(f=h),f>d.height()-e.move.outerHeight()-b.border[0]+e.setY&&(f=d.height()-e.move.outerHeight()-b.border[0]+e.setY)}e.move.css({left:c,top:f}),b.moveType&&e.moveLayer(),c=null,f=null,g=null,h=null}}).mouseup(function(){try{e.ismove&&(e.moveLayer(),e.move.remove()),e.ismove=!1}catch(a){e.ismove=!1}b.moveEnd&&b.moveEnd()})},h.pt.autoclose=function(){var a=this,b=a.config.time,c=function(){b--,0===b&&(layer.close(a.index),clearInterval(a.autotime))};a.autotime=setInterval(c,1e3)},f.config={end:{}},h.pt.callback=function(){var a=this,b=a.layerE,d=a.config,e=d.dialog;a.openLayer(),a.config.success(b),layer.ie6&&a.IE6(b),b.find(".xubox_close").on("click",function(){d.close(a.index),layer.close(a.index)}),b.find(".xubox_yes").on("click",function(){d.yes?d.yes(a.index):e.yes(a.index)}),b.find(".xubox_no").on("click",function(){d.no?d.no(a.index):e.no(a.index),layer.close(a.index)}),a.config.shadeClose&&c("#xubox_shade"+a.index).on("click",function(){layer.close(a.index)}),b.find(".xubox_min").on("click",function(){layer.min(a.index,d),d.min&&d.min(b)}),b.find(".xubox_max").on("click",function(){c(this).hasClass("xubox_maxmin")?(layer.restore(a.index),d.restore&&d.restore(b)):(layer.full(a.index,d),d.full&&d.full(b))}),f.config.end[a.index]=d.end},f.reselect=function(){c.each(c("select"),function(){var a=c(this);a.parents("."+g[0])[0]||1==a.attr("layer")&&c("."+g[0]).length<1&&a.removeAttr("layer").show(),a=null})},h.pt.IE6=function(a){var b=this,e=a.offset().top;if(b.config.fix)var f=function(){a.css({top:d.scrollTop()+e})};else var f=function(){a.css({top:e})};f(),d.scroll(f),c.each(c("select"),function(){var a=c(this);a.parents("."+g[0])[0]||"none"==a.css("display")||a.attr({layer:"1"}).hide(),a=null})},h.pt.openLayer=function(){{var a=this;a.layerE}layer.autoArea=function(b){return a.autoArea(b)},layer.shift=function(b,c,d){a.shift(b,c,d)},layer.setMove=function(){return a.move()},layer.zIndex=a.config.zIndex,layer.setTop=function(a){var b=function(){layer.zIndex++,a.css("z-index",layer.zIndex+1)};return layer.zIndex=parseInt(a[0].style.zIndex),a.on("mousedown",b),layer.zIndex}},f.isauto=function(a,b,c){"auto"===b.area[0]&&(b.area[0]=a.outerWidth()),"auto"===b.area[1]&&(b.area[1]=a.outerHeight()),a.attr({area:b.area+","+c}),a.find(".xubox_max").addClass("xubox_maxmin")},f.rescollbar=function(a){g.html.attr("layer-full")==a&&(g.html[0].style.removeProperty?g.html[0].style.removeProperty("overflow"):g.html[0].style.removeAttribute("overflow"),g.html.removeAttr("layer-full"))},layer.getIndex=function(a){return c(a).parents("."+g[0]).attr("times")},layer.getChildFrame=function(a,b){return b=b||c("."+g[1]).parents("."+g[0]).attr("times"),c("#"+g[0]+b).find("."+g[1]).contents().find(a)},layer.getFrameIndex=function(a){return c(a?"#"+a:"."+g[1]).parents("."+g[0]).attr("times")},layer.iframeAuto=function(a){a=a||c("."+g[1]).parents("."+g[0]).attr("times");var b=layer.getChildFrame("body",a).outerHeight(),d=c("#"+g[0]+a),e=d.find(g[2]),f=0;e&&(f=e.height()),d.css({height:b+f});var h=-parseInt(c("#xubox_border"+a).css("top"));c("#xubox_border"+a).css({height:b+2*h+f}),c("#"+g[1]+a).css({height:b})},layer.iframeSrc=function(a,b){c("#"+g[0]+a).find("iframe").attr("src",b)},layer.area=function(a,b){var d=[c("#"+g[0]+a),c("#xubox_border"+a)],e=d[0].attr("type"),h=d[0].find(g[5]),i=d[0].find(g[2]);if(e===f.type[1]||e===f.type[2]){if(d[0].css(b),h.css({width:b.width,height:b.height}),e===f.type[2]){var j=d[0].find("iframe");j.css({width:b.width,height:i?b.height-i.innerHeight():b.height})}"0px"!==d[0].css("margin-left")&&(b.hasOwnProperty("top")&&d[0].css({top:b.top-(d[1][0]?parseFloat(d[1].css("top")):0)}),b.hasOwnProperty("left")&&d[0].css({left:b.left+d[0].outerWidth()/2-(d[1][0]?parseFloat(d[1].css("left")):0)}),d[0].css({marginLeft:-d[0].outerWidth()/2})),d[1][0]&&d[1].css({width:parseFloat(b.width)-2*parseFloat(d[1].css("left")),height:parseFloat(b.height)-2*parseFloat(d[1].css("top"))})}},layer.min=function(a,b){var d=c("#"+g[0]+a),e=[d.position().top,d.position().left+parseFloat(d.css("margin-left"))];f.isauto(d,b,e),layer.area(a,{width:180,height:35}),d.find(".xubox_min").hide(),"page"===d.attr("type")&&d.find(g[4]).hide(),f.rescollbar(a)},layer.restore=function(a){{var b=c("#"+g[0]+a),d=b.attr("area").split(",");b.attr("type")}layer.area(a,{width:parseFloat(d[0]),height:parseFloat(d[1]),top:parseFloat(d[2]),left:parseFloat(d[3])}),b.find(".xubox_max").removeClass("xubox_maxmin"),b.find(".xubox_min").show(),"page"===b.attr("type")&&b.find(g[4]).show(),f.rescollbar(a)},layer.full=function(a,b){var e,h=c("#"+g[0]+a),i=2*b.border[0]||6,j=[h.position().top,h.position().left+parseFloat(h.css("margin-left"))];f.isauto(h,b,j),g.html.attr("layer-full")||g.html.css("overflow","hidden").attr("layer-full",a),clearTimeout(e),e=setTimeout(function(){layer.area(a,{top:"fixed"===h.css("position")?0:d.scrollTop(),left:"fixed"===h.css("position")?0:d.scrollLeft(),width:d.width()-i,height:d.height()-i})},100)},layer.title=function(a,b){var d=c("#"+g[0]+(b||layer.index)).find(".xubox_title>em");d.html(a)},layer.close=function(a){var b=c("#"+g[0]+a),d=b.attr("type"),e=c("#xubox_moves, #xubox_shade"+a);if(b[0]){if(d==f.type[1])if(b.find(".xuboxPageHtml")[0])b[0].innerHTML="",b.remove();else{b.find(".xubox_setwin,.xubox_close,.xubox_botton,.xubox_title,.xubox_border").remove();for(var h=0;3>h;h++)b.find(".layer_pageContent").unwrap().hide()}else b[0].innerHTML="",b.remove();e.remove(),layer.ie6&&f.reselect(),f.rescollbar(a),"function"==typeof f.config.end[a]&&f.config.end[a](),delete f.config.end[a]}},layer.closeLoad=function(){layer.close(c(".xubox_loading").parents("."+g[0]).attr("times"))},layer.closeTips=function(){layer.closeAll("tips")},layer.closeAll=function(a){c.each(c("."+g[0]),function(){var b=c(this),d=a?b.attr("type")===a:1;d&&layer.close(b.attr("times")),d=null})},f.run=function(){c=jQuery,d=c(a),g.html=c("html"),layer.use("skin/layer.css"),c.layer=function(a){var b=new h(a);return b.index},(new Image).src=layer.path+"skin/default/xubox_ico0.png"},"function"==typeof define?define(function(){return f.run(),layer}):f.run()}(window);
\ No newline at end of file
diff --git a/static/js/layer/skin/layer.css b/static/js/layer/skin/layer.css
index 26afd7563..4d04643f0 100644
--- a/static/js/layer/skin/layer.css
+++ b/static/js/layer/skin/layer.css
@@ -1,4 +1,3 @@
-<<<<<<< HEAD
/**
@Name: layer's style
@@ -82,88 +81,3 @@
-=======
-/**
-
- @Name: layer's style
- @Date: 2012.09.15
- @Author: 贤心
- @blog: sentsin.com
-
-**/
-
-*html{background-image:url(about:blank); background-attachment:fixed;}
-
-/** common **/
-.xubox_shade, .xubox_layer{position:fixed; _position:absolute;}
-.xubox_shade{top:0; left:0; width:100%; height:100%; _height:expression(document.body.offsetHeight+"px");}
-.xubox_layer{top:150px; left:50%; height:auto; width:310px; margin-left:-155px;}
-.xubox_border, .xubox_title, .xubox_title i, .xubox_page, .xubox_iframe, .xubox_title em, .xubox_close, .xubox_msgico, .xubox_moves{position:absolute;}
-.xubox_border{border-radius: 5px;}
-.xubox_title{left:0; top:0;}
-.xubox_main{position:relative; height:100%; _float:left;}
-.xubox_page{top:0; left:0;}
-.xubox_load{background:url(default/xubox_loading0.gif) #fff center center no-repeat;}
-.xubox_loading{display:block; float:left; text-decoration:none; color:#FFF; _float:none; }
-.xulayer_png32{background:url(default/xubox_ico0.png) no-repeat;}
-.xubox_moves{border:3px solid #666; cursor:move; background-color:rgba(255,255,255,.3); background-color:#fff\9; filter:alpha(opacity=50);}
-
-.xubox_msgico{width:32px; height:32px; top:52px; left:15px; background:url(default/xubox_ico0.png) no-repeat;}
-.xubox_text{ padding-left:55px; float:left; line-height:25px; word-break:break-all; padding-right:20px; overflow:hidden; font-size:14px;}
-.xubox_msgtype0{background-position:-91px -38px;}
-.xubox_msgtype1{background-position:-128px -38px }
-.xubox_msgtype2{background-position:-163px -38px;}
-.xubox_msgtype3{background-position:-91px -75px;}
-.xubox_msgtype4{background-position:-163px -75px;}
-.xubox_msgtype5{background-position:-163px -112px;}
-.xubox_msgtype6{background-position:-163px -148px;}
-.xubox_msgtype7{background-position:-128px -75px;}
-.xubox_msgtype8{background-position:-91px -6px;}
-.xubox_msgtype9{background-position:-129px -6px;}
-.xubox_msgtype10{background-position:-163px -6px;}
-.xubox_msgtype11{background-position:-206px -6px;}
-.xubox_msgtype12{background-position:-206px -44px;}
-.xubox_msgtype13{background-position:-206px -81px;}
-.xubox_msgtype14{background-position:-206px -122px;}
-.xubox_msgtype15{background-position:-206px -157px;}
-.xubox_loading_0{width:60px; height:24px; background:url(default/xubox_loading0.gif) no-repeat;}
-.xubox_loading_1{width:37px; height:37px; background:url(default/xubox_loading1.gif) no-repeat;}
-.xubox_loading_2, .xubox_msgtype16{width:32px; height:32px; background:url(default/xubox_loading2.gif) no-repeat;}
-.xubox_loading_3{width:126px; height:22px; background:url(default/xubox_loading3.gif) no-repeat;}
-
-.xubox_setwin{position:absolute; right:10px; *right:0; top:10px; font-size:0;}
-.xubox_setwin a{position:relative; display:inline-block; *display:inline; *zoom:1; vertical-align:top; width: 14px; height:14px; margin-left:10px; font-size:12px; _overflow:hidden;}
-.xubox_setwin .xubox_min cite{position:absolute; width:14px; height:2px; left:0; top:50%; margin-top:-1px; background-color:#919191; cursor:pointer; _overflow:hidden;}
-.xubox_setwin .xubox_min:hover cite{background-color:#2D93CA; }
-.xubox_setwin .xubox_max{background-position:-6px -189px;}
-.xubox_setwin .xubox_max:hover{background-position:-6px -206px;}
-.xubox_setwin .xubox_maxmin{background-position:-29px -189px;}
-.xubox_setwin .xubox_maxmin:hover{background-position:-29px -206px;}
-.xubox_setwin .xubox_close0{ width:14px; height:14px; background-position: -31px -7px; cursor:pointer;}
-.xubox_setwin .xubox_close0:hover{background-position:-51px -7px;}
-.xubox_setwin .xubox_close1{position:absolute; right:-28px; top:-28px; width:30px; height:30px; margin-left:0; background-position:-60px -195px; *right:-18px; _right:-15px; _top:-23px; _width:14px; _height:14px; _background-position:-31px -7px;}
-.xubox_setwin .xubox_close1:hover{ background-position:-91px -195px; _background-position:-51px -7px;}
-
-.xubox_title{width:100%; height:35px; line-height:35px; border-bottom:1px solid #D5D5D5; background:url(default/xubox_title0.png) #EBEBEB repeat-x; font-size:14px; color:#333;}
-.xubox_title em{height:20px; line-height:20px; width:60%; top:7px; left:10px; font-style:normal; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;}
-
-.xubox_botton a{position:absolute; bottom:10px; left:50%; background:url(default/xubox_ico0.png) repeat; text-decoration:none; color:#FFF; font-size:14px; text-align:center; font-weight:bold; overflow:hidden; }
-.xubox_botton a:hover{text-decoration:none; color:#FFF; }
-.xubox_botton .xubox_botton1{ width:79px; height:32px; line-height:32px; margin-left:-39px; background-position:-6px -34px;}
-.xubox_botton1:hover{background-position:-6px -72px;}
-.xubox_botton .xubox_botton2{margin-left:-76px; width:71px; height:29px; line-height:29px; background-position:-5px -114px;}
-.xubox_botton2:hover{ background-position:-5px -146px;}
-.xubox_botton .xubox_botton3{width:71px; height:29px; line-height:29px; margin-left:10px; background-position:-81px -114px;}
-.xubox_botton3:hover{background-position:-81px -146px;}
-.xubox_tips{position:relative; line-height:20px; min-width: 12px; padding:3px 30px 3px 10px; font-size:12px; _float:left; border-radius:3px; box-shadow: 1px 1px 3px rgba(0,0,0,.3);}
-.xubox_tips i.layerTipsG{ position:absolute; width:0; height:0; border-width:8px; border-color:transparent; border-style:dashed; *overflow:hidden;}
-.xubox_tips i.layerTipsT, .xubox_tips i.layerTipsB{left:5px; border-right-style:solid;}
-.xubox_tips i.layerTipsT{bottom:-8px;}
-.xubox_tips i.layerTipsB{top:-8px;}
-.xubox_tips i.layerTipsR, .xubox_tips i.layerTipsL{top:1px; border-bottom-style:solid;}
-.xubox_tips i.layerTipsR{left:-8px;}
-.xubox_tips i.layerTipsL{right:-8px;}
-
-
-
->>>>>>> beta
diff --git a/static/js/layer/skin/layer.ext.css b/static/js/layer/skin/layer.ext.css
index 8d051c5aa..6570a05d9 100644
--- a/static/js/layer/skin/layer.ext.css
+++ b/static/js/layer/skin/layer.ext.css
@@ -1,4 +1,3 @@
-<<<<<<< HEAD
/**
@Name: layer拓展样式
@@ -44,50 +43,3 @@
.xubox_imgtit em{padding-left:10px;}
-=======
-/**
-
- @Name: layer拓展样式
- @Date: 2012.12.13
- @Author: 贤心
- @blog: sentsin.com
-
-**/
-
-.xubox_iconext{background:url(default/icon_ext.png) no-repeat;}
-
-/* prompt模式 */
-.xubox_layer .xubox_form{width:240px; height:30px; line-height:30px; padding: 0 5px; border: 1px solid #ccc; background: url(default/textbg.png) #fff repeat-x; color:#333;}
-.xubox_layer .xubox_formArea{width:300px; height:100px; line-height:20px;}
-
-/* tab模式 */
-.xubox_layer .xubox_tab{position:relative; background-color:#fff; box-shadow:1px 1px 50px rgba(0,0,0,.4)}
-.xubox_layer .xubox_tabmove{position:absolute; width:600px; height:30px; top:0; left:0;}
-.xubox_layer .xubox_tabtit{ display:block; height:34px; border-bottom:1px solid #ccc; background-color:#eee;}
-.xubox_layer .xubox_tabtit span{position:relative; float:left; width:120px; height:34px; line-height:34px; text-align:center; cursor:default;}
-.xubox_layer .xubox_tabtit span.xubox_tabnow{left:-1px; _top:1px; height:35px; border-left:1px solid #ccc; border-right:1px solid #ccc; background-color:#fff; z-index:10;}
-.xubox_layer .xubox_tab_main{line-height:24px; clear:both;}
-.xubox_layer .xubox_tab_main .xubox_tabli{display:none;}
-.xubox_layer .xubox_tab_main .xubox_tabli.xubox_tab_layer{display:block;}
-.xubox_layer .xubox_tabclose{position:absolute; right:10px; top:5px; cursor:pointer;}
-
-/* photo模式 */
-.xubox_bigimg, .xubox_intro{height:300px}
-.xubox_bigimg{position:relative; display:block; width:600px; text-align:center; background:url(default/xubox_loading1.gif) center center no-repeat #000; overflow:hidden; }
-.xubox_bigimg img{position:relative; display:inline-block; visibility: hidden;}
-.xubox_intro{position:absolute; right:-315px; top:0; width:300px; background-color:#fff; overflow-x:hidden; overflow-y:auto;}
-.xubox_imgsee{display:none;}
-.xubox_prev, .xubox_next{position:absolute; top:50%; width:27px; _width:44px; height:44px; margin-top:-22px; outline:none;blr:expression(this.onFocus=this.blur());}
-.xubox_prev{left:10px; background-position:-5px -5px; _background-position:-70px -5px;}
-.xubox_prev:hover{background-position:-33px -5px; _background-position:-120px -5px;}
-.xubox_next{right:10px; _right:8px; background-position:-5px -50px; _background-position:-70px -50px;}
-.xubox_next:hover{background-position:-33px -50px; _background-position:-120px -50px;}
-.xubox_imgbar{position:absolute; left:0; bottom:0; width:100%; height:32px; line-height:32px; background-color:rgba(0,0,0,.8); background-color:#000\9; filter:Alpha(opacity=80); color:#fff; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; font-size:0;}
-.xubox_imgtit{/*position:absolute; left:20px;*/}
-.xubox_imgtit *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; font-size:12px;}
-.xubox_imgtit a{max-width:65%; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; color:#fff;}
-.xubox_imgtit a:hover{color:#fff; text-decoration:underline;}
-.xubox_imgtit em{padding-left:10px;}
-
-
->>>>>>> beta
diff --git a/templates/jlog/log_offline.html b/templates/jlog/log_offline.html
index 3a0b3f96c..12bfb5af5 100644
--- a/templates/jlog/log_offline.html
+++ b/templates/jlog/log_offline.html
@@ -128,17 +128,6 @@
var div_username = ' 用户名: '+''+username+'' + '';
var div_ip = ' 主机: '+'' + ip + '';
var div_time = ' 开始时间: ' + ''+start_time +'' + ' 结束时间: ' +'' + end_time + '').html(data.replace(/\n/g,"
"));
@@ -149,7 +138,6 @@
globalConfig = {
SOCKET_HOST: "{{ web_socket_host }}"
};
->>>>>>> beta
function log_search(){
$.ajax({
diff --git a/templates/jlog/log_online.html b/templates/jlog/log_online.html
index a7efed7a7..d75b27fbb 100644
--- a/templates/jlog/log_online.html
+++ b/templates/jlog/log_online.html
@@ -136,19 +136,11 @@
BootstrapDialog.show({message:function(){
var option, exsit_message;
var escapeString = function (html){
-<<<<<<< HEAD
- var elem = document.createElement('div')
- var txt = document.createTextNode(html)
- elem.appendChild(txt)
- return elem.innerHTML;
- }
-=======
var elem = document.createElement('div');
var txt = document.createTextNode(html);
elem.appendChild(txt);
return elem.innerHTML;
};
->>>>>>> beta
var tag = $('');
//告诉服务器端有用户登录
socket.emit('login', {userid:message.id, filename:message.filename});