Changes in [4983:c5bd00aa0b49:4984:a87820fbdad7]
- Location:
- sage
- Files:
-
- 1 added
- 10 edited
-
dsage/scripts/dsage_setup.py (modified) (5 diffs)
-
dsage/scripts/dsage_worker.py (modified) (1 diff)
-
interfaces/expect.py (modified) (1 diff)
-
interfaces/psage.py (modified) (1 diff)
-
interfaces/sage0.py (modified) (3 diffs)
-
rings/polynomial/polynomial_element.pyx (modified) (1 diff)
-
server/notebook/js.py (modified) (1 diff)
-
server/notebook/notebook.py (modified) (9 diffs)
-
server/notebook/secureuser.py (added)
-
server/notebook/twist.py (modified) (10 diffs)
-
server/notebook/worksheet.py (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
sage/dsage/scripts/dsage_setup.py
r4947 r4962 19 19 20 20 import os 21 import random 22 import socket 21 23 import ConfigParser 22 24 import subprocess … … 28 30 from sage.dsage.misc.config import check_dsage_dir 29 31 from sage.dsage.__version__ import version 32 33 from sage.misc.viewer import cmd_exists 30 34 31 35 DB_DIR = os.path.join(DSAGE_DIR, 'db/') … … 75 79 def setup_server(template=None): 76 80 check_dsage_dir() 77 template_dict = {'organization': 'SAGE ',81 template_dict = {'organization': 'SAGE (at %s)'%(socket.gethostname()), 78 82 'unit': '389', 79 83 'locality': None, … … 83 87 'uid': 'sage_user', 84 88 'dn_oid': None, 85 'serial': 007,89 'serial': str(random.randint(1,2**31)), 86 90 'dns_name': None, 87 91 'crl_dist_points': None, … … 120 124 print DELIMITER 121 125 print "Generating SSL certificate for server..." 122 cmd = ['certtool --generate-privkey --outfile %s' % privkey_file] 123 # cmd = ['openssl genrsa > %s' % privkey_file] 124 subprocess.call(cmd, shell=True) 126 if os.uname()[0] != 'Darwin' and cmd_exists('openssl'): 127 # We use openssl by default if it exists, since it is *vastly* 128 # faster on Linux. 129 cmd = ['openssl genrsa > %s' % privkey_file] 130 print "Using openssl to generate key" 131 print cmd[0] 132 subprocess.call(cmd, shell=True) 133 else: 134 cmd = ['certtool --bits 128 --generate-privkey --outfile %s' % privkey_file] 135 print "Using certtool to generate key" 136 print cmd[0] 137 # cmd = ['openssl genrsa > %s' % privkey_file] 138 subprocess.call(cmd, shell=True) 139 125 140 # cmd = ['openssl req -config %s -new -x509 -key %s -out %s -days \ 126 141 # 1000' % (os.path.join(SAGE_ROOT,'local/openssl/openssl.cnf'), -
sage/dsage/scripts/dsage_worker.py
r4935 r4965 526 526 if self.log_level > 3: 527 527 logfile = DSAGE_DIR + '/%s-pexpect.log' % self.id 528 self.sage = Sage(maxread=1, logfile=logfile )528 self.sage = Sage(maxread=1, logfile=logfile, python=True) 529 529 else: 530 self.sage = Sage(maxread=1 )530 self.sage = Sage(maxread=1, python=True) 531 531 try: 532 532 self.sage._start(block_during_init=True) -
sage/interfaces/expect.py
r4903 r4966 93 93 if command == None: 94 94 command = name 95 if server !=None:95 if not server is None: 96 96 command = "ssh -t %s %s"%(server, command) 97 97 self.__is_remote = True 98 98 eval_using_file_cutoff = 0 # don't allow this! 99 #print command 99 if verbose_start: 100 print "Using remote server" 101 print command 100 102 self._server = server 101 103 self.__do_cleaner = do_cleaner -
sage/interfaces/psage.py
r1565 r4966 49 49 50 50 class PSage(Sage): 51 def __init__(self, maxread=10000, script_subdirectory=None,52 logfile=None, preparse=True):53 Sage.__init__(self, maxread=maxread, script_subdirectory=script_subdirectory,54 logfile=logfile, preparse=preparse)51 def __init__(self, **kwds): 52 if kwds.has_key('server'): 53 raise NotImplementedError, "PSage doesn't work on remote server yet." 54 Sage.__init__(self, **kwds) 55 55 import sage.misc.misc 56 56 T = sage.misc.misc.tmp_dir('sage_smp') -
sage/interfaces/sage0.py
r4550 r4966 103 103 def __init__(self, maxread=10000, script_subdirectory=None, 104 104 logfile=None, preparse=True, server=None, 105 do_cleaner=True, python= True, path=None,106 init_code=None ):105 do_cleaner=True, python=False, path=None, 106 init_code=None, verbose_start=False): 107 107 if python: 108 108 command = "sage -python -u" … … 127 127 init_code = init_code, 128 128 do_cleaner = do_cleaner, 129 path = path 129 path = path, 130 verbose_start = verbose_start, 130 131 ) 131 132 self._preparse = preparse … … 180 181 181 182 def _send_tmpfile_to_server(self): 182 cmd = 'scp "%s" %s:"%s" '%(tmp, self._server, self._remote_tmpfile())183 cmd = 'scp "%s" %s:"%s" 1>&2 2>/dev/null'%(tmp, self._server, self._remote_tmpfile()) 183 184 #print cmd 184 185 os.system(cmd) 185 186 186 187 def _get_object_from_server_tmpfile(self): 187 cmd = 'scp %s:"%s_get.sobj" "%s_get.sobj" '%( self._server, self._remote_tmpfile(), tmp)188 cmd = 'scp %s:"%s_get.sobj" "%s_get.sobj" 1>&2 2>/dev/null'%( self._server, self._remote_tmpfile(), tmp) 188 189 #print cmd 189 190 os.system(cmd) -
sage/rings/polynomial/polynomial_element.pyx
r4870 r4963 125 125 return self.polynomial([-x for x in self.list()]) 126 126 127 def plot(self, xmin= 0, xmax=1, *args, **kwds):127 def plot(self, xmin=None, xmax=None, *args, **kwds): 128 128 """ 129 129 Return a plot of this polynomial. -
sage/server/notebook/js.py
r4952 r4958 1227 1227 1228 1228 function worksheet_command(cmd) { 1229 return cmd;1229 return ('/ws/' + worksheet_name + '/' + cmd); 1230 1230 } 1231 1231 -
sage/server/notebook/notebook.py
r4981 r4984 369 369 370 370 class Notebook(SageObject): 371 def __init__(self, dir='sage_notebook', username=None, 372 password=None, color='default', system=None, 373 show_debug = False, log_server=False, address='localhost', 374 port=8000, secure=True): 371 def __init__(self, 372 dir='sage_notebook', 373 system=None, 374 show_debug = False, 375 log_server=False, 376 address='localhost', 377 port=8000, 378 secure=True, 379 server_pool = []): 375 380 self.__dir = dir 381 self.__server_pool = server_pool 376 382 self.set_system(system) 377 self.__color = color378 if not (username is None):379 self.set_auth(username,password)380 383 self.__worksheets = {} 381 384 self.__load_defaults() 382 self.__filename = '%s/nb.sobj'%dir385 self.__filename = '%s/nb.sobj'%dir 383 386 self.__worksheet_dir = '%s/worksheets'%dir 384 self.__object_dir = '%s/objects'%dir387 self.__object_dir = '%s/objects'%dir 385 388 self.__makedirs() 386 389 self.__next_worksheet_id = 0 … … 393 396 self.__show_debug = show_debug 394 397 self.save() 398 399 def server_pool(self): 400 try: 401 return self.__server_pool 402 except AttributeError: 403 self.__server_pool = [] 404 return [] 405 406 def set_server_pool(self, servers): 407 self.__server_pool = servers 408 409 def get_server(self): 410 P = self.server_pool() 411 if len(P) == 0: 412 return None 413 try: 414 i = (self.__server_number + 1)%len(P) 415 except AttributeError: 416 self.__server_number = 0 417 i = 0 418 return P[i] 395 419 396 420 def system(self): … … 507 531 508 532 def import_worksheet(self, filename): 533 # TODO -- this is broken -- it does *not* work if you 534 # upload a worksheet with the same name as an existing worksheet, 535 # though somebody thinks they wrote it to do that. 536 # The problem is that changing the worksheet name is not 537 # enough -- one must also change the worksheet id. 538 # One should get rid of the id stuff, maybe. For now, 539 # we raise an error if the worksheet name is already used. 509 540 if not os.path.exists(filename): 510 541 raise ValueError, "no file %s"%filename … … 522 553 names = self.worksheet_names() 523 554 if D in names: 555 raise ValueError, "Worksheet with given name already defined." 524 556 m = re.match('.*?([0-9]+)$',D) 525 557 if m is None: … … 971 1003 worksheet = None 972 1004 else: 1005 if not worksheet_authorized: 1006 return """ 1007 <form method="POST" action="https://localhost:8000/login"> 1008 Username: <input type="text" name="email" size="15" /> 1009 Password: <input type="password" name="password" size="15" /> 1010 <br /> 1011 <div align="center"> 1012 <p><input type="submit" value="Login" /></p> </div> </form><br /><br /> 1013 """ 1014 973 1015 worksheet = self.get_worksheet_with_id(worksheet_id) 974 1016 if worksheet.computing(): … … 1004 1046 body += ' <img src="/images/sagelogo.png" alt="SAGE"></a></span>\n' 1005 1047 body += ' <span class="control_commands" id="cell_controls">\n' 1006 body += """<form method="POST" action="https://localhost:8000/login"> Username: <input type="text" name="email" size="15" /> Password: <input type="password" name="password" size="15" /><br /> <div align="center"> <p><input type="submit" value="Login" /></p> </div> </form><br /><br />"""1007 1048 body += ' <a class="history_link" onClick="history_window()">Log</a>' + vbar 1008 1049 body += ' <a class="help" onClick="show_help_window()">Help</a>' + vbar 1009 1050 body += ' <a href="/doc">Documentation</a>' + vbar 1010 body += ' <a href=" __upload__.html" class="upload_worksheet">Upload</a>'1051 body += ' <a href="/upload" class="upload_worksheet">Upload</a>' 1011 1052 body += ' </span>\n' 1012 1053 … … 1452 1493 import time 1453 1494 1454 def load_notebook(dir, username=None, password=None, color=None, system=None, 1455 splashpage=None, address=None, port=None, secure=None): 1495 def load_notebook(dir, server_pool=[], address=None, port=None, secure=None): 1456 1496 sobj = '%s/nb.sobj'%dir 1457 1497 if os.path.exists(sobj): … … 1472 1512 nb.delete_doc_browser_worksheets() 1473 1513 nb.set_directory(dir) 1474 if not (username is None):1475 nb.set_auth(username=username, password=password)1476 if not (color is None):1477 nb.set_color(color)1478 if not system is None:1479 nb.set_system(system)1480 if not splashpage is None:1481 nb.set_splashpage(splashpage)1482 1514 nb.set_not_computing() 1483 1515 else: 1484 nb = Notebook(dir,username=username,password=password, color=color, 1485 system=system) 1516 nb = Notebook(dir,server_pool=server_pool) 1486 1517 1487 1518 nb.address = address … … 1596 1627 instead of the bottom button. 1597 1628 """ 1598 1629 assert 0, "deprecated" 1599 1630 import worksheet 1600 1631 worksheet.init_sage_prestart() -
sage/server/notebook/twist.py
r4983 r4984 131 131 <br><br><br> 132 132 <font size=+3> 133 <a href="static ">Static Documentation</a><br><br>134 <a href="live ">Interactive Live Documentation</a><br>133 <a href="static/">Static Documentation</a><br><br> 134 <a href="live/">Interactive Live Documentation</a><br> 135 135 </font> 136 136 """ 137 137 return http.Response(stream=s) 138 139 ############################ 140 # Uploading a saved worksheet file 141 ############################ 142 143 class Upload(resource.Resource): 144 def render(self, ctx): 145 return http.Response(stream = notebook.upload_window()) 146 147 class UploadWorksheet(resource.PostableResource): 148 def render(self, ctx): 149 tmp = '%s/tmp.sws'%notebook.directory() 150 f = file(tmp,'wb') 151 f.write(ctx.files['fileField'][0][2].read()) 152 f.close() 153 try: 154 W = notebook.import_worksheet(tmp) 155 except ValueError, msg: 156 s = "<html>Error uploading worksheet '%s'. <a href='/'>continue</a></html>"%msg 157 return http.Response(stream = s) 158 os.unlink(tmp) 159 s = redirect('/ws/' + W.filename()) 160 return http.Response(stream = s) 161 138 162 139 163 … … 180 204 # examples. 181 205 ######################################################## 206 def redirect(url): 207 return '<html><head><meta http-equiv="REFRESH" content="0; URL=%s"></head></html>'%url 208 182 209 class FastRedirect(resource.Resource): 183 210 def __init__(self, dest): 184 211 self.dest = dest 185 212 def render(self, ctx): 186 s = '<html><head><meta http-equiv="REFRESH" content="0; URL=%s"></head></html>'%self.dest 187 return http.Response(stream = s) 213 return http.Response(stream = redirect(self.dest)) 188 214 189 215 class FastRedirectWithEffect(FastRedirect): … … 442 468 return http.Response(stream=s) 443 469 470 471 class Worksheet_download(WorksheetResource, resource.Resource): 472 def childFactory(self, request, name): 473 worksheet_name = self.name 474 try: 475 notebook.export_worksheet(worksheet_name, worksheet_name) 476 except KeyError: 477 return http.Response(stream='No such worksheet.') 478 479 binfile = '%s/%s.sws'%(notebook.directory(), worksheet_name) 480 return static.File(binfile) 444 481 445 482 class Worksheet_restart_sage(WorksheetResource, resource.Resource): … … 670 707 child_notebook = Notebook() 671 708 child_doc = Doc() 709 child_upload = Upload() 710 child_upload_worksheet = UploadWorksheet() 672 711 child_register = RegistrationPage() 673 712 child_confirm = RegConfirmation() … … 728 767 import sage.dsage.all 729 768 sage.dsage.all.dsage.setup() 730 if not os.path.exists(dsage + '/ cacert.pem'):769 if not os.path.exists(dsage + '/pubcert.pem'): 731 770 print "Error configuring." 732 771 return … … 739 778 port = 8000, 740 779 address = 'localhost', 741 port_tries = 1,780 port_tries = 0, 742 781 secure = True, 743 multisession= True, 744 jsmath = True): 782 server_pool = None): 745 783 r""" 746 784 Experimental twisted version of the SAGE Notebook. 785 786 INPUT: 787 directory -- (default: 'sage_notebook') directory that contains 788 the SAGE notebook files 789 port -- (default: 8000), port to serve the notebook on 790 address -- (default: 'localhost'), address to listen on 791 port_tries -- (default: 0), number of additional ports to try if the 792 first one doesn't work (*not* implemented) 793 secure -- (default: True) if True use https so all 794 communication, e.g., logins and passwords, 795 between web browsers and the SAGE notebook is 796 encrypted (via GNU TLS). 797 ADVANCED OPTIONS: 798 server_pool -- (default: None), if given, should be a list like 799 ['sage1@localhost', 'sage2@localhost'], where 800 you have setup ssh keys so that typing 801 ssh sage1@localhost 802 logs in without requiring a password, e.g., by typing 803 as the notebook server user 804 cd; ssh-keygen -t rsa 805 then putting ~/.ssh/id_rsa.pub as the file .ssh/authorized_keys2. 747 806 """ 748 807 if not os.path.exists(directory): … … 750 809 port = int(port) 751 810 conf = '%s/twistedconf.py'%directory 811 812 # We load the notebook to make sure it is created with the 813 # given options, then delete it. The notebook is later 814 # loaded by the *other* Twisted process below. 815 if not server_pool is None: 816 from sage.server.notebook.notebook import load_notebook 817 nb = load_notebook(directory, server_pool=server_pool) 818 nb.set_server_pool(server_pool) 819 nb.save() 820 del nb 752 821 753 822 def run(port): … … 769 838 config.write(""" 770 839 import sage.server.notebook.notebook 771 sage.server.notebook.notebook.JSMATH= %s840 sage.server.notebook.notebook.JSMATH=True 772 841 import sage.server.notebook.notebook as notebook 773 842 import sage.server.notebook.twist as twist 774 843 twist.notebook = notebook.load_notebook(%s) 775 844 import sage.server.notebook.worksheet as worksheet 776 worksheet.init_sage_prestart() 777 worksheet.multisession = %s 845 worksheet.init_sage_prestart(twist.notebook.get_server()) 778 846 779 847 import signal, sys … … 810 878 s = strports.service('%s', factory) 811 879 s.setServiceParent(application) 812 """%( jsmath, notebook_opts, multisession, strport))880 """%(os.path.abspath(directory), strport)) 813 881 814 882 … … 822 890 823 891 824 for i in range(int(port_tries) ):892 for i in range(int(port_tries)+1): 825 893 try: 826 894 run(port + i) -
sage/server/notebook/worksheet.py
r4952 r4968 56 56 # in notebook.py is called. 57 57 multisession = True 58 def initialized_sage( ):59 S = Sage( maxread = 1)58 def initialized_sage(server): 59 S = Sage(server=server, maxread = 1, python=True) 60 60 S._start(block_during_init=False) 61 61 E = S.expect() … … 70 70 71 71 _a_sage = None 72 def init_sage_prestart( ):72 def init_sage_prestart(server): 73 73 global _a_sage 74 _a_sage = initialized_sage( )74 _a_sage = initialized_sage(server) 75 75 76 def one_prestarted_sage( ):76 def one_prestarted_sage(server): 77 77 global _a_sage 78 78 X = _a_sage 79 79 if multisession: 80 init_sage_prestart( )80 init_sage_prestart(server) 81 81 return X 82 82 … … 87 87 self.__system = system 88 88 self.__next_id = (_notebook.MAX_WORKSHEETS) * id 89 self. __name = name89 self.set_name(name) 90 90 self.__notebook = notebook 91 91 self.__passcode = crypt.crypt(passcode, self.salt()) 92 92 self.__passcrypt= True 93 dir = list(name)94 for i in range(len(dir)):95 if not dir[i].isalnum() and dir[i] != '_':96 dir[i] = '_'97 dir = ''.join(dir)98 self.__filename = dir99 93 self.__dir = '%s/%s'%(notebook.worksheet_directory(), dir) 100 94 self.clear() … … 401 395 except AttributeError: 402 396 pass 403 self.__sage = one_prestarted_sage( )397 self.__sage = one_prestarted_sage(server=self.notebook().get_server()) 404 398 verbose("Initializing SAGE.") 405 399 os.environ['PAGER'] = 'cat' … … 549 543 os.makedirs('%s/code'%self.directory()) 550 544 tmp = '%s/code/%s.py'%(self.directory(), id) 551 input = 'os.chdir("%s")\n'%os.path.abspath(D) 545 546 absD = os.path.abspath(D) 547 input = 'os.chdir("%s")\n'%absD 548 549 # TODOss 550 os.system('chmod -R a+rw "%s"'%absD) 552 551 553 552 if C.time(): … … 820 819 # We do this to avoid getting a stale SAGE that uses old code. 821 820 self.clear_queue() 822 self.__sage = initialized_sage( )821 self.__sage = initialized_sage(server = self.notebook().get_server()) 823 822 self.initialize_sage() 824 823 self._enqueue_auto_cells() … … 1166 1165 def set_name(self, name): 1167 1166 self.__name = name 1167 dir = list(name) 1168 for i in range(len(dir)): 1169 if not dir[i].isalnum() and dir[i] != '_': 1170 dir[i] = '_' 1171 dir = ''.join(dir) 1172 self.__filename = dir 1168 1173 1169 1174 def append(self, L): … … 1248 1253 menu += ' <a class="hide" onClick="hide_all()">Hide</a>/<a class="hide" onClick="show_all()">Show</a>' + vbar 1249 1254 menu += ' <a class="slide_mode" onClick="slide_mode()">Focus</a>' + vbar 1250 menu += ' <a class="download_sws" href="download ">Download</a>'+ vbar1255 menu += ' <a class="download_sws" href="download/%s.sws">Download</a>'%self.filename() + vbar 1251 1256 menu += ' <a class="delete" href="delete">Delete</a>' 1252 1257 menu += ' </span>'
Note: See TracChangeset
for help on using the changeset viewer.
