Ignore:
Location:
sage
Files:
1 added
10 edited

Legend:

Unmodified
Added
Removed
  • sage/dsage/scripts/dsage_setup.py

    r4947 r4962  
    1919 
    2020import os 
     21import random 
     22import socket 
    2123import ConfigParser 
    2224import subprocess 
     
    2830from sage.dsage.misc.config import check_dsage_dir 
    2931from sage.dsage.__version__ import version 
     32 
     33from sage.misc.viewer import cmd_exists 
    3034 
    3135DB_DIR = os.path.join(DSAGE_DIR, 'db/') 
     
    7579def setup_server(template=None): 
    7680    check_dsage_dir() 
    77     template_dict = {'organization': 'SAGE', 
     81    template_dict = {'organization': 'SAGE (at %s)'%(socket.gethostname()), 
    7882                'unit': '389', 
    7983                'locality': None, 
     
    8387                'uid': 'sage_user', 
    8488                'dn_oid': None, 
    85                 'serial': 007, 
     89                'serial': str(random.randint(1,2**31)), 
    8690                'dns_name': None, 
    8791                'crl_dist_points': None, 
     
    120124    print DELIMITER 
    121125    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         
    125140    # cmd = ['openssl req  -config %s -new -x509 -key %s -out %s -days \ 
    126141    #        1000' % (os.path.join(SAGE_ROOT,'local/openssl/openssl.cnf'), 
  • sage/dsage/scripts/dsage_worker.py

    r4935 r4965  
    526526            if self.log_level > 3: 
    527527                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) 
    529529            else: 
    530                 self.sage = Sage(maxread=1) 
     530                self.sage = Sage(maxread=1, python=True) 
    531531            try: 
    532532                self.sage._start(block_during_init=True) 
  • sage/interfaces/expect.py

    r4903 r4966  
    9393        if command == None: 
    9494            command = name 
    95         if server != None: 
     95        if not server is None: 
    9696            command = "ssh -t %s %s"%(server, command) 
    9797            self.__is_remote = True 
    9898            eval_using_file_cutoff = 0  # don't allow this! 
    99             #print command 
     99            if verbose_start: 
     100                print "Using remote server" 
     101                print command 
    100102            self._server = server 
    101103        self.__do_cleaner = do_cleaner 
  • sage/interfaces/psage.py

    r1565 r4966  
    4949 
    5050class 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) 
    5555        import sage.misc.misc 
    5656        T = sage.misc.misc.tmp_dir('sage_smp') 
  • sage/interfaces/sage0.py

    r4550 r4966  
    103103    def __init__(self, maxread=10000, script_subdirectory=None, 
    104104                       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): 
    107107        if python: 
    108108            command = "sage -python -u" 
     
    127127                        init_code = init_code, 
    128128                        do_cleaner = do_cleaner, 
    129                         path = path 
     129                        path = path, 
     130                        verbose_start = verbose_start, 
    130131                        ) 
    131132        self._preparse = preparse 
     
    180181 
    181182    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()) 
    183184        #print cmd 
    184185        os.system(cmd) 
    185186 
    186187    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) 
    188189        #print cmd 
    189190        os.system(cmd) 
  • sage/rings/polynomial/polynomial_element.pyx

    r4870 r4963  
    125125        return self.polynomial([-x for x in self.list()]) 
    126126 
    127     def plot(self, xmin=0, xmax=1, *args, **kwds): 
     127    def plot(self, xmin=None, xmax=None, *args, **kwds): 
    128128        """ 
    129129        Return a plot of this polynomial. 
  • sage/server/notebook/js.py

    r4952 r4958  
    12271227 
    12281228function worksheet_command(cmd) { 
    1229     return cmd; 
     1229    return ('/ws/' + worksheet_name + '/' + cmd); 
    12301230}     
    12311231 
  • sage/server/notebook/notebook.py

    r4981 r4984  
    369369 
    370370class 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 = []): 
    375380        self.__dir = dir 
     381        self.__server_pool = server_pool 
    376382        self.set_system(system) 
    377         self.__color = color 
    378         if not (username is None): 
    379             self.set_auth(username,password) 
    380383        self.__worksheets = {} 
    381384        self.__load_defaults() 
    382         self.__filename     = '%s/nb.sobj'%dir 
     385        self.__filename      = '%s/nb.sobj'%dir 
    383386        self.__worksheet_dir = '%s/worksheets'%dir 
    384         self.__object_dir   = '%s/objects'%dir 
     387        self.__object_dir    = '%s/objects'%dir 
    385388        self.__makedirs() 
    386389        self.__next_worksheet_id = 0 
     
    393396        self.__show_debug = show_debug 
    394397        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] 
    395419 
    396420    def system(self): 
     
    507531 
    508532    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. 
    509540        if not os.path.exists(filename): 
    510541            raise ValueError, "no file %s"%filename 
     
    522553        names = self.worksheet_names() 
    523554        if D in names: 
     555            raise ValueError, "Worksheet with given name already defined." 
    524556            m = re.match('.*?([0-9]+)$',D) 
    525557            if m is None: 
     
    9711003            worksheet = None 
    9721004        else: 
     1005            if not worksheet_authorized: 
     1006                return """ 
     1007<form method="POST" action="https://localhost:8000/login"> 
     1008Username: <input type="text" name="email" size="15" /> 
     1009Password: <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 
    9731015            worksheet = self.get_worksheet_with_id(worksheet_id) 
    9741016            if worksheet.computing(): 
     
    10041046        body += '  <img src="/images/sagelogo.png" alt="SAGE"></a></span>\n' 
    10051047        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 />""" 
    10071048        body += '    <a class="history_link" onClick="history_window()">Log</a>' + vbar  
    10081049        body += '    <a class="help" onClick="show_help_window()">Help</a>' + vbar 
    10091050        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>' 
    10111052        body += '  </span>\n' 
    10121053 
     
    14521493import time 
    14531494 
    1454 def load_notebook(dir, username=None, password=None, color=None, system=None, 
    1455                   splashpage=None, address=None, port=None, secure=None): 
     1495def load_notebook(dir, server_pool=[], address=None, port=None, secure=None): 
    14561496    sobj = '%s/nb.sobj'%dir 
    14571497    if os.path.exists(sobj): 
     
    14721512        nb.delete_doc_browser_worksheets() 
    14731513        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) 
    14821514        nb.set_not_computing() 
    14831515    else: 
    1484         nb = Notebook(dir,username=username,password=password, color=color, 
    1485                       system=system) 
     1516        nb = Notebook(dir,server_pool=server_pool) 
    14861517 
    14871518    nb.address = address 
     
    15961627    instead of the bottom button. 
    15971628    """ 
    1598  
     1629    assert 0, "deprecated" 
    15991630    import worksheet 
    16001631    worksheet.init_sage_prestart() 
  • sage/server/notebook/twist.py

    r4983 r4984  
    131131        <br><br><br> 
    132132        <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> 
    135135        </font> 
    136136        """ 
    137137        return http.Response(stream=s) 
     138 
     139############################ 
     140# Uploading a saved worksheet file 
     141############################ 
     142     
     143class Upload(resource.Resource): 
     144    def render(self, ctx): 
     145        return http.Response(stream = notebook.upload_window()) 
     146 
     147class 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         
    138162     
    139163 
     
    180204# examples. 
    181205######################################################## 
     206def redirect(url): 
     207    return '<html><head><meta http-equiv="REFRESH" content="0; URL=%s"></head></html>'%url 
     208 
    182209class FastRedirect(resource.Resource): 
    183210    def __init__(self, dest): 
    184211        self.dest = dest 
    185212    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)) 
    188214 
    189215class FastRedirectWithEffect(FastRedirect): 
     
    442468        return http.Response(stream=s) 
    443469 
     470 
     471class 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) 
    444481 
    445482class Worksheet_restart_sage(WorksheetResource, resource.Resource): 
     
    670707    child_notebook = Notebook() 
    671708    child_doc = Doc() 
     709    child_upload = Upload() 
     710    child_upload_worksheet = UploadWorksheet() 
    672711    child_register = RegistrationPage() 
    673712    child_confirm = RegConfirmation() 
     
    728767        import sage.dsage.all 
    729768        sage.dsage.all.dsage.setup() 
    730     if not os.path.exists(dsage + '/cacert.pem'): 
     769    if not os.path.exists(dsage + '/pubcert.pem'): 
    731770        print "Error configuring." 
    732771        return 
     
    739778             port        = 8000, 
    740779             address     = 'localhost', 
    741              port_tries  = 1, 
     780             port_tries  = 0, 
    742781             secure      = True, 
    743              multisession= True, 
    744              jsmath      = True): 
     782             server_pool = None): 
    745783    r""" 
    746784    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.  
    747806    """ 
    748807    if not os.path.exists(directory): 
     
    750809    port = int(port) 
    751810    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 
    752821 
    753822    def run(port): 
     
    769838        config.write(""" 
    770839import sage.server.notebook.notebook 
    771 sage.server.notebook.notebook.JSMATH=%s 
     840sage.server.notebook.notebook.JSMATH=True 
    772841import sage.server.notebook.notebook as notebook 
    773842import sage.server.notebook.twist as twist 
    774843twist.notebook = notebook.load_notebook(%s) 
    775844import sage.server.notebook.worksheet as worksheet 
    776 worksheet.init_sage_prestart() 
    777 worksheet.multisession = %s 
     845worksheet.init_sage_prestart(twist.notebook.get_server()) 
    778846 
    779847import signal, sys 
     
    810878s = strports.service('%s', factory) 
    811879s.setServiceParent(application) 
    812 """%(jsmath, notebook_opts, multisession, strport)) 
     880"""%(os.path.abspath(directory), strport)) 
    813881 
    814882 
     
    822890                      
    823891 
    824     for i in range(int(port_tries)): 
     892    for i in range(int(port_tries)+1): 
    825893        try: 
    826894            run(port + i) 
  • sage/server/notebook/worksheet.py

    r4952 r4968  
    5656# in notebook.py is called. 
    5757multisession = True 
    58 def initialized_sage(): 
    59     S = Sage(maxread = 1) 
     58def initialized_sage(server): 
     59    S = Sage(server=server, maxread = 1, python=True) 
    6060    S._start(block_during_init=False) 
    6161    E = S.expect() 
     
    7070 
    7171_a_sage = None 
    72 def init_sage_prestart(): 
     72def init_sage_prestart(server): 
    7373    global _a_sage 
    74     _a_sage = initialized_sage() 
     74    _a_sage = initialized_sage(server) 
    7575     
    76 def one_prestarted_sage(): 
     76def one_prestarted_sage(server): 
    7777    global _a_sage 
    7878    X = _a_sage 
    7979    if multisession: 
    80         init_sage_prestart() 
     80        init_sage_prestart(server) 
    8181    return X 
    8282 
     
    8787        self.__system = system 
    8888        self.__next_id = (_notebook.MAX_WORKSHEETS) * id 
    89         self.__name = name 
     89        self.set_name(name) 
    9090        self.__notebook = notebook 
    9191        self.__passcode = crypt.crypt(passcode, self.salt()) 
    9292        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 = dir 
    9993        self.__dir = '%s/%s'%(notebook.worksheet_directory(), dir) 
    10094        self.clear() 
     
    401395        except AttributeError: 
    402396            pass 
    403         self.__sage = one_prestarted_sage() 
     397        self.__sage = one_prestarted_sage(server=self.notebook().get_server()) 
    404398        verbose("Initializing SAGE.") 
    405399        os.environ['PAGER'] = 'cat' 
     
    549543            os.makedirs('%s/code'%self.directory()) 
    550544        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) 
    552551         
    553552        if C.time(): 
     
    820819        # We do this to avoid getting a stale SAGE that uses old code.  
    821820        self.clear_queue() 
    822         self.__sage = initialized_sage() 
     821        self.__sage = initialized_sage(server = self.notebook().get_server()) 
    823822        self.initialize_sage() 
    824823        self._enqueue_auto_cells() 
     
    11661165    def set_name(self, name): 
    11671166        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 
    11681173 
    11691174    def append(self, L): 
     
    12481253            menu += '    <a class="hide" onClick="hide_all()">Hide</a>/<a class="hide" onClick="show_all()">Show</a>' + vbar 
    12491254            menu += '    <a class="slide_mode" onClick="slide_mode()">Focus</a>' + vbar 
    1250             menu += '    <a class="download_sws" href="download">Download</a>' + vbar 
     1255            menu += '    <a class="download_sws" href="download/%s.sws">Download</a>'%self.filename() + vbar 
    12511256            menu += '    <a class="delete" href="delete">Delete</a>' 
    12521257            menu += '  </span>' 
Note: See TracChangeset for help on using the changeset viewer.