Changes in [7424:59c0c1153bbe:8380:5785440c95c5]
- Files:
-
- 11 added
- 2 deleted
- 16 edited
-
sage/combinat/combinat.py (modified) (1 diff)
-
sage/dsage/database/monitordb.py (modified) (4 diffs)
-
sage/dsage/dsage.py (modified) (4 diffs)
-
sage/dsage/misc/constants.py (modified) (1 diff)
-
sage/dsage/scripts/dsage_get_stats.py (deleted)
-
sage/dsage/scripts/dsage_server.py (modified) (4 diffs)
-
sage/dsage/scripts/dsage_setup.py (modified) (6 diffs)
-
sage/dsage/scripts/dsage_worker.py (modified) (6 diffs)
-
sage/dsage/server/server.py (modified) (2 diffs)
-
sage/dsage/server/stats.py (added)
-
sage/dsage/twisted/pb.py (modified) (1 diff)
-
sage/dsage/web/index.html (added)
-
sage/dsage/web/static/asc.gif (added)
-
sage/dsage/web/static/bg.gif (added)
-
sage/dsage/web/static/desc.gif (added)
-
sage/dsage/web/static/dsage_web.css (modified) (3 diffs)
-
sage/dsage/web/static/dsage_web.js (modified) (1 diff)
-
sage/dsage/web/static/index.html (deleted)
-
sage/dsage/web/static/jquery.history.js (added)
-
sage/dsage/web/web_server.py (modified) (7 diffs)
-
sage/libs/pari/gen.pyx (modified) (1 diff)
-
sage/rings/number_field/all.py (modified) (1 diff)
-
sage/rings/number_field/number_field_element.pyx (modified) (1 diff)
-
sage/rings/number_field/totallyreal.py (added)
-
sage/rings/number_field/totallyreal_data.pyx (added)
-
sage/rings/number_field/totallyreal_dsage.py (added)
-
sage/rings/number_field/totallyreal_phc.py (added)
-
sage/rings/number_field/totallyreal_rel.py (added)
-
setup.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
sage/combinat/combinat.py
r7409 r8380 193 193 194 194 from sage.interfaces.all import gap, maxima 195 from sage.rings.all import QQ, RR,ZZ195 from sage.rings.all import QQ, ZZ 196 196 from sage.rings.arith import binomial 197 197 from sage.misc.sage_eval import sage_eval -
sage/dsage/database/monitordb.py
r7308 r7660 130 130 131 131 def update_monitor(self, host_info): 132 import pdb; pdb.set_trace()133 132 query = """UPDATE monitors 134 133 SET hostname = ?, ip = ?, workers = ?, sage_version = ?, os = ?, … … 251 250 self.con.commit() 252 251 253 def get_worker_count(self, connected, busy ):252 def get_worker_count(self, connected, busy=False): 254 253 """ 255 254 Returns the number of workers. … … 276 275 return sum(w[0] for w in result) 277 276 278 def get_cpu_speed(self, connected=True, busy= True):277 def get_cpu_speed(self, connected=True, busy=False): 279 278 """ 280 279 Returns the aggregate cpu speed in Mhz. … … 285 284 """ 286 285 287 if connected :286 if connected and busy: 288 287 query = """SELECT cpu_speed, workers FROM monitors 289 288 WHERE connected AND busy""" 289 elif connected: 290 query = """SELECT cpu_speed, workers FROM monitors 291 WHERE connected""" 290 292 else: 291 293 query = """SELECT cpu_speed, workers FROM monitors""" -
sage/dsage/dsage.py
r6745 r7644 106 106 107 107 def start_all(self, port=None, workers=2, log_level=0, poll=1.0, 108 anonymous_workers=False, verbose=True): 108 anonymous_workers=False, job_failure_threshold=3, 109 verbose=True): 109 110 """ 110 111 Start the server and worker and returns a connection to the server. … … 118 119 port = find_open_port() 119 120 self.server(port=port, log_level=log_level, blocking=False, 121 job_failure_threshold=job_failure_threshold, 120 122 verbose=verbose) 121 123 self.worker(port=port, workers=workers, log_level=log_level, … … 167 169 stats_file=os.path.join(DSAGE_DIR, 'dsage.xml'), 168 170 anonymous_logins=False, 171 job_failure_threshold=3, 169 172 verbose=True): 170 173 r""" … … 185 188 186 189 cmd = 'dsage_server.py -d %s -p %s -l %s -f %s ' + \ 187 '-c %s -k %s -- statsfile=%s'188 cmd = cmd % (db_file, port, log_level, log_file, cert, privkey, 189 stats_file)190 '-c %s -k %s --jobfailures %s --statsfile=%s' 191 cmd = cmd % (db_file, port, log_level, log_file, cert, privkey, 192 job_failure_threshold, stats_file) 190 193 if ssl: 191 194 cmd += ' --ssl' -
sage/dsage/misc/constants.py
r4657 r7650 3 3 DELIMITER = '-' * 50 4 4 DSAGE_DIR = os.path.join(os.getenv('DOT_SAGE'), 'dsage') 5 TMP_WORKER_FILES = os.path.join(DSAGE_DIR, 'tmp_worker_files') 6 -
sage/dsage/scripts/dsage_server.py
r7307 r7660 101 101 default=os.path.join(DSAGE_DIR, 'dsage.db'), 102 102 help='database file') 103 parser.add_option('--job _failures',103 parser.add_option('--jobfailures', 104 104 dest='job_failure_threshold', 105 105 type='int', … … 117 117 return options 118 118 119 def write_stats(dsage_server, stats_file):120 check_dsage_dir()121 try:122 fname = os.path.join(DSAGE_DIR, stats_file)123 f = open(fname, 'w')124 f.write(dsage_server.generate_xml_stats())125 f.close()126 except Exception, msg:127 print Exception128 print 'Error writing stats: %s' % (msg)129 return130 131 119 def create_manhole(): 132 120 """ … … 202 190 203 191 # Create the looping call that will output the XML file for Dashboard 204 tsk1 = task.LoopingCall(write_stats, dsage_server, STATS_FILE)205 tsk1.start(2.0, now=False)192 # tsk1 = task.LoopingCall(write_stats, dsage_server, STATS_FILE) 193 # tsk1.start(2.0, now=False) 206 194 207 195 SERVER_PORT = find_open_port() … … 237 225 from twisted.web2 import server, http, resource, channel, static 238 226 from sage.dsage.web.web_server import Toplevel, GetJobDetails 239 top_level = Toplevel(dsage_server )227 top_level = Toplevel(dsage_server, SERVER_PORT) 240 228 # top_level.putChild(GetJobDetails(dsage_server)) 241 229 site = server.Site(top_level) -
sage/dsage/scripts/dsage_setup.py
r6720 r7657 56 56 return config 57 57 58 def add_default_user(): 59 """ 60 Adds the default user. 61 62 """ 63 64 from twisted.conch.ssh import keys 65 import base64 66 from getpass import getuser 67 68 username = getuser() 69 pubkey_file = os.path.join(DSAGE_DIR, 'dsage_key.pub') 70 clientdb = ClientDatabase() 71 pubkey = base64.encodestring( 72 keys.getPublicKeyString(filename=pubkey_file).strip()) 73 if clientdb.get_user(username) is None: 74 clientdb.add_user(username, pubkey) 75 print 'Added user %s.\n' % (username) 76 else: 77 user, key = clientdb.get_user_and_key(username) 78 if key != pubkey: 79 clientdb.del_user(username) 80 clientdb.add_user(username, pubkey) 81 print "User %s's pubkey changed, setting to new one." % (username) 82 else: 83 print 'User %s already exists.' % (username) 84 58 85 def setup_client(testing=False): 59 86 check_dsage_dir() … … 62 89 cmd = ["ssh-keygen", "-q", "-trsa", "-P ''", "-f%s" % key_file] 63 90 return 64 91 92 if not cmd_exists('ssh-keygen'): 93 print DELIMITER 94 print "Could NOT find ssh-keygen." 95 print "Aborting." 96 return 97 65 98 print DELIMITER 66 99 print "Generating public/private key pair for authentication..." … … 68 101 print "Just hit enter when prompted for a passphrase" 69 102 print DELIMITER 103 70 104 cmd = ["ssh-keygen", "-q", "-trsa", "-f%s" % key_file] 71 105 ld = os.environ['LD_LIBRARY_PATH'] … … 75 109 finally: 76 110 os.environ['LD_LIBRARY_PATH'] = ld 111 77 112 print "\n" 78 113 print "Client configuration finished.\n" … … 131 166 f.write(s) 132 167 f.close() 168 133 169 # Disable certificate generation -- not used right now anyways 134 170 privkey_file = os.path.join(DSAGE_DIR, 'cacert.pem') 135 171 pubkey_file = os.path.join(DSAGE_DIR, 'pubcert.pem') 172 136 173 print DELIMITER 137 174 print "Generating SSL certificate for server..." 175 138 176 if os.uname()[0] != 'Darwin' and cmd_exists('openssl'): 139 177 # We use openssl by default if it exists, since it is *vastly* … … 157 195 subprocess.call(cmd, shell=True) 158 196 print DELIMITER 197 198 # Set read only permissions on cert 159 199 os.chmod(os.path.join(DSAGE_DIR, 'cacert.pem'), 0600) 160 200 161 # conf_file = os.path.join(DSAGE_DIR, 'server.conf')162 # config.write(open(conf_file, 'w'))163 164 201 # add default user 165 from twisted.conch.ssh import keys 166 import base64 167 168 # c = ConfigParser.ConfigParser() 169 # c.read(os.path.join(DSAGE_DIR, 'client.conf')) 170 from getpass import getuser 171 username = getuser() 172 pubkey_file = os.path.join(DSAGE_DIR, 'dsage_key.pub') 173 clientdb = ClientDatabase() 174 pubkey = base64.encodestring( 175 keys.getPublicKeyString(filename=pubkey_file).strip()) 176 if clientdb.get_user(username) is None: 177 clientdb.add_user(username, pubkey) 178 print 'Added user %s.\n' % (username) 179 else: 180 user, key = clientdb.get_user_and_key(username) 181 if key != pubkey: 182 clientdb.del_user(username) 183 clientdb.add_user(username, pubkey) 184 print "User %s's pubkey changed, setting to new one." % (username) 185 else: 186 print 'User %s already exists.' % (username) 202 add_default_user() 187 203 188 204 print "Server configuration finished.\n\n" -
sage/dsage/scripts/dsage_worker.py
r7307 r7660 49 49 from sage.dsage.misc.constants import DELIMITER 50 50 from sage.dsage.misc.constants import DSAGE_DIR 51 from sage.dsage.misc.constants import TMP_WORKER_FILES 51 52 from sage.dsage.misc.misc import random_str 52 53 … … 194 195 195 196 cur_dir = os.getcwd() # keep a reference to the current directory 196 tmp_dir = os.path.join(DSAGE_DIR, 'tmp_worker_files') 197 tmp_job_dir = os.path.join(tmp_dir, job.job_id) 198 if not os.path.isdir(tmp_dir): 199 os.mkdir(tmp_dir) 197 tmp_job_dir = os.path.join(TMP_WORKER_FILES, job.job_id) 198 if not os.path.isdir(TMP_WORKER_FILES): 199 os.mkdir(TMP_WORKER_FILES) 200 200 if not os.path.isdir(tmp_job_dir): 201 201 os.mkdir(tmp_job_dir) … … 350 350 msg = 'Checking job %s' % self.job.job_id 351 351 log.msg(LOG_PREFIX % self.id + msg) 352 os.chdir(self.tmp_job_dir) 352 353 try: 353 os.chdir(self.tmp_job_dir)354 354 # foo, output, new = self.sage._so_far() 355 355 # This sucks and is a very bad way to tell when a calculation is … … 499 499 """ 500 500 501 # Set status to free and delete any current jobs we have 502 self.free = True 503 self.job = None 504 501 505 if hard_reset: 502 506 log.msg(LOG_PREFIX % self.id + 'Performing hard reset.') 503 507 self.kill_sage() 504 self.start()505 508 else: # try for a soft reset 506 509 INTERRUPT_TRIES = 20 … … 527 530 if not success: 528 531 self.kill_sage() 529 self.start()530 532 else: 531 533 self.sage.reset() 532 self.free = True533 self.job = None534 534 535 535 def start(self): … … 733 733 return 734 734 735 factory = pb.PBClientFactory()736 735 self.factory = PBClientFactory() 737 736 try: -
sage/dsage/server/server.py
r7296 r7660 285 285 msg = '%s failed, removing from queue.' % (job_id) 286 286 log.msg(msg) 287 288 job.update_time = datetime.datetime.now() 287 289 288 290 return self.jobdb.store_job(job.reduce()) … … 355 357 356 358 return count 357 358 def generate_xml_stats(self):359 """360 This method returns a an XML document to be consumed by the361 Mac OS X Dashboard widget and the web server.362 363 """364 365 def create_gauge(doc):366 gauge = doc.createElement('gauge')367 doc.appendChild(gauge)368 369 return doc, gauge370 371 def add_totalAgentCount(doc, gauge):372 totalAgentCount = doc.createElement('totalAgentCount')373 gauge.appendChild(totalAgentCount)374 working_workers = self.monitordb.get_worker_count(connected=True,375 busy=True)376 free_workers = self.monitordb.get_worker_count(connected=True,377 busy=False)378 disconnected_workers = self.monitordb.get_worker_count(379 connected=False,380 busy=False)381 total_workers = (working_workers +382 free_workers +383 disconnected_workers)384 count = doc.createTextNode(str(total_workers))385 totalAgentCount.appendChild(count)386 387 return doc, totalAgentCount388 389 def add_onlineAgentCount(doc, gauge):390 onlineAgentCount = doc.createElement('onlineAgentCount')391 gauge.appendChild(onlineAgentCount)392 free_workers = self.monitordb.get_worker_count(connected=True,393 busy=False)394 busy_workers = self.monitordb.get_worker_count(connected=True,395 busy=True)396 count = doc.createTextNode(str(free_workers + busy_workers))397 onlineAgentCount.appendChild(count)398 399 return doc, onlineAgentCount400 401 def add_offlineAgentCount(doc, gauge):402 offlineAgentCount = doc.createElement('offlineAgentCount')403 gauge.appendChild(offlineAgentCount)404 worker_count = self.monitordb.get_worker_count(connected=False,405 busy=False)406 count = doc.createTextNode(str(worker_count))407 offlineAgentCount.appendChild(count)408 409 return doc, offlineAgentCount410 411 def add_workingAgentCount(doc, gauge):412 workingAgentCount = doc.createElement('workingAgentCount')413 gauge.appendChild(workingAgentCount)414 worker_count = self.monitordb.get_worker_count(connected=True,415 busy=True)416 count = doc.createTextNode(str(worker_count))417 workingAgentCount.appendChild(count)418 419 return doc, workingAgentCount420 421 def add_availableAgentCount(doc, gauge):422 availableAgentCount = doc.createElement('availableAgentCount')423 gauge.appendChild(availableAgentCount)424 worker_count = self.monitordb.get_worker_count(connected=True,425 busy=False)426 count = doc.createTextNode(str(worker_count))427 availableAgentCount.appendChild(count)428 429 return doc, availableAgentCount430 431 def add_unavailableAgentCount(doc, gauge):432 unavailableAgentCount = doc.createElement('unavailableAgentCount')433 gauge.appendChild(unavailableAgentCount)434 worker_count = self.monitordb.get_worker_count(connected=True,435 busy=True)436 count = doc.createTextNode(str(worker_count))437 unavailableAgentCount.appendChild(count)438 439 return doc, unavailableAgentCount440 441 def add_workingMegaHertz(doc, gauge):442 workingMegaHertz = doc.createElement('workingMegaHertz')443 gauge.appendChild(workingMegaHertz)444 cpu_speed = self.monitordb.get_cpu_speed(connected=True,445 busy=True)446 mhz = doc.createTextNode(str(cpu_speed))447 workingMegaHertz.appendChild(mhz)448 449 return doc, workingMegaHertz450 451 def add_availableProcessorCount(doc, gauge):452 pass453 454 def add_unavailableProcessorCount(doc, gauge):455 pass456 457 def add_onlineProcessorCount(doc, gauge):458 onlineProcessorCount = doc.createElement('onlineProcessorCount')459 gauge.appendChild(onlineProcessorCount)460 cpu_count = self.monitordb.get_cpu_count(connected=True)461 c = doc.createTextNode(str(cpu_count))462 onlineProcessorCount.appendChild(c)463 464 return doc, onlineProcessorCount465 466 def add_offlineProcessorCount(doc, gauge):467 offlineProcessorCount = doc.createElement('offlineProcessorCount')468 gauge.appendChild(offlineProcessorCount)469 cpu_count = self.monitordb.get_cpu_count(connected=False)470 c = doc.createTextNode(str(cpu_count))471 offlineProcessorCount.appendChild(c)472 473 return doc, offlineProcessorCount474 475 def add_workingProcessorCount(doc, gauge):476 workingProcessorCount = doc.createElement('workingProcessorCount')477 gauge.appendChild(workingProcessorCount)478 worker_count = self.monitordb.get_cpu_count(connected=True)479 pcount = doc.createTextNode(str(worker_count))480 workingProcessorCount.appendChild(pcount)481 482 return doc, workingProcessorCount483 484 def add_workingAgentPercentage(doc, gauge):485 workingAgentPercentage = doc.createElement(486 'workingAgentPercentage')487 gauge.appendChild(workingAgentPercentage)488 working_workers = self.monitordb.get_worker_count(connected=True,489 busy=True)490 free_workers = self.monitordb.get_worker_count(connected=True,491 busy=False)492 disconnected_workers = self.monitordb.get_worker_count(493 connected=False,494 busy=False)495 total_workers = (working_workers +496 free_workers +497 disconnected_workers)498 499 if total_workers != 0:500 worker_percentage = (float(working_workers / total_workers) *501 100)502 else:503 worker_percentage = 0.0504 percentage = doc.createTextNode(str(worker_percentage))505 workingAgentPercentage.appendChild(percentage)506 507 return doc, workingAgentPercentage508 509 def add_date(doc, gauge):510 date = datetime.datetime.now()511 512 year = doc.createElement('Year')513 gauge.appendChild(year)514 year.appendChild(doc.createTextNode(str(date.year)))515 516 seconds = doc.createElement('Seconds')517 gauge.appendChild(seconds)518 seconds.appendChild(doc.createTextNode(str(date.second)))519 520 minutes = doc.createElement('Minutes')521 gauge.appendChild(minutes)522 minutes.appendChild(doc.createTextNode(str(date.minute)))523 524 return doc, year, seconds, minutes525 526 doc = xml.dom.minidom.Document()527 doc, gauge = create_gauge(doc)528 529 add_totalAgentCount(doc, gauge)530 add_onlineAgentCount(doc, gauge)531 add_offlineAgentCount(doc, gauge)532 add_availableAgentCount(doc, gauge)533 add_unavailableAgentCount(doc, gauge)534 add_workingAgentCount(doc, gauge)535 add_workingAgentPercentage(doc, gauge)536 537 add_onlineProcessorCount(doc, gauge)538 add_offlineAgentCount(doc, gauge)539 add_availableProcessorCount(doc, gauge)540 add_unavailableProcessorCount(doc, gauge)541 add_workingProcessorCount(doc, gauge)542 add_workingMegaHertz(doc, gauge)543 544 add_date(doc, gauge)545 s = cStringIO.StringIO()546 doc.writexml(s, newl='\n')547 548 return s.getvalue()549 359 550 360 class DSageWorkerServer(DSageServer): -
sage/dsage/twisted/pb.py
r7306 r7641 75 75 creds.signature, 76 76 mind) 77 78 77 return d 79 78 elif IAnonymous.providedBy(creds): -
sage/dsage/web/static/dsage_web.css
r7296 r7656 32 32 } 33 33 34 #server_stats {35 padding-left: 60%;36 font-size:10px;37 }38 39 34 #title { 40 35 font-size:24px; … … 45 40 padding-bottom:10px; 46 41 margin:0px; 42 } 43 44 #navigator { 45 font-size:10px; 46 text-align: center; 47 } 48 49 #server_title { 50 font-size: 24px; 51 } 52 53 #help { 54 font-size: 12px; 47 55 } 48 56 … … 95 103 /* end css tabs */ 96 104 97 table.jobs_table, table.job_details { 98 border: solid #000 1px; 99 border-bottom: solid #000 1px; 100 border-right: solid #000 1px; 101 border-collapse: collapse; 102 width: 100%; 103 margin-left: auto; 104 margin-right: auto; 105 padding-left:10px; 106 padding-right:10px; 105 table.tablesorter { 106 font-family:arial; 107 background-color: #CDCDCD; 108 margin:10px 0pt 15px; 109 font-size: 8pt; 110 width: 100%; 111 text-align: left; 107 112 } 108 table.jobs_table tr.tr0, table.job_details tr.tr0 { 109 font-size:16px; 110 background-color: #FFFFFF; 113 table.tablesorter thead tr th, table.tablesorter tfoot tr th { 114 background-color: #e6EEEE; 115 border: 1px solid #FFF; 116 font-size: 8pt; 117 padding: 4px; 111 118 } 112 table.jobs_table tr.tr1, table.job_details tr.tr1 { 113 font-size:16px; 114 background-color: #D8CAA8; 119 table.tablesorter thead tr .header { 120 background-image: url(bg.gif); 121 background-repeat: no-repeat; 122 background-position: center right; 123 cursor: pointer; 115 124 } 116 table.jobs_table tr.thead, table.job_details tr.thead { 117 125 table.tablesorter tbody td { 126 color: #3D3D3D; 127 padding: 4px; 128 background-color: #FFF; 129 vertical-align: top; 118 130 } 119 120 #jobs_table { 121 border: solid #000 1px; 122 border-bottom: solid #000 1px; 123 border-right: solid #000 1px; 124 border-collapse: collapse; 125 width: 100%; 126 margin-left: auto; 127 margin-right: auto; 128 padding-left:10px; 129 padding-right:10px; 131 table.tablesorter tbody tr.odd td { 132 background-color:#F0F0F6; 130 133 } 131 #jobs_table thead { 132 width:100%; 133 height:20px; 134 font-size:16px; 135 background-color: #D8CAA8; 136 font-family: 'verdana'; 134 table.tablesorter thead tr .headerSortUp { 135 background-image: url(asc.gif); 137 136 } 138 table. jobs_table A:link, table.job_details A:link{139 color: #193441;137 table.tablesorter thead tr .headerSortDown { 138 background-image: url(desc.gif); 140 139 } 141 table. jobs_table A:visited, table.job_details A:link{142 color: #3E606F;140 table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp { 141 background-color: #8dbdd8; 143 142 } -
sage/dsage/web/static/dsage_web.js
r7304 r7658 1 var count = 10; // Default count 2 3 function getServerDetails () { 4 $('#server_details').load('get_server_details', function() { 5 $("#server_details").tablesorter(); }); 6 showServer(); 7 } 8 9 function showServer () { 10 $('#jobs_table').hide(); 11 $('#job_details').hide(); 12 $('#help').hide(); 13 $('#navigator').hide(); 14 $('#server_details').show(); 15 } 16 function getJobs (c) { 17 count = c; // Set global variable count to the selected count. 18 19 // Load jobs table with the given number of jobs. 20 $('#jobs_table').load('get_jobs', {'count': c}, function() { 21 $("#jobs_table").tablesorter(); } ); 22 23 // Change current selected count to red 24 $('#navigator > a').css('color', 'black'); 25 $('#' + c).css('color', 'red'); 26 } 27 28 function showJobs () { 29 $('#server_details').hide(); 30 $('#job_details').hide(); 31 $('#help').hide(); 32 $('#jobs_table').show(); 33 $('#navigator').show(); 34 } 35 36 function getJobDetails (job_id) { 37 $('#job_details').load('get_details', {'job_id': job_id}, function() { 38 $("#job_details").tablesorter(); } ); 39 showJobDetails(); 40 } 41 42 function showJobDetails () { 43 $('#jobs_table').hide(); 44 $('#navigator').hide(); 45 $('#server_details').hide(); 46 $('#help').hide(); 47 $('#job_details').show(); 48 } 49 50 function getHelp () { 51 $('#help').load('get_help'); 52 showHelp(); 53 } 54 55 function showHelp () { 56 $('#jobs_table').hide(); 57 $('#navigator').hide(); 58 $('#server_details').hide(); 59 $('#job_details').hide(); 60 $('#help').show(); 61 } 62 63 // PageLoad function 64 // This function is called when: 65 // 1. after calling $.historyInit(); 66 // 2. after calling $.historyLoad(); 67 // 3. after pushing "Go Back" button of a browser 68 function pageload(hash) { 69 // hash doesn't contain the first # character. 70 if(hash) { 71 // restore ajax loaded state 72 if (hash=='jobs') { 73 showJobs(); 74 } 75 else if (hash=='server') { 76 getServerDetails(); 77 } 78 else if (hash=='help') { 79 getHelp(); 80 } 81 } 82 else { 83 // start page 84 showJobs(); 85 } 86 } 87 88 function gethash (that) { 89 var hash = that.href; 90 hash = hash.replace(/^.*#/, ''); 91 // moves to a new page. 92 // pageload is called at once. 93 $.historyLoad(hash); 94 return false; 95 } 96 1 97 $(document).ready(function() 2 98 { 3 $("#myTable").tablesorter(); 99 // Initialize history plugin. 100 // The callback is called at once by present location.hash. 101 $.historyInit(pageload); 102 // set onlick event for buttons 103 $("a[@rel='history']").click(function() {gethash(this); }); 104 getJobs(count); // Run it the first time 105 106 // Only show jobs if this.href is none or jobs 107 if (this.href == '' || this.href == '#jobs') { 108 showJobs(); 109 } 110 // setInterval('getJobs(count)', 5000); // Update it every 5 seconds. 4 111 } 5 112 ); -
sage/dsage/web/web_server.py
r7296 r7660 20 20 import os 21 21 import sqlite3 22 from cStringIO import StringIO 23 import socket 22 24 23 25 from twisted.web2 import http, resource 24 26 from twisted.web2 import static, http_headers, responsecode 25 27 28 from sage.dsage.misc.constants import TMP_WORKER_FILES 29 from sage.dsage.server.stats import XMLStats 30 31 from xml.etree.ElementTree import (ElementTree as ET, 32 Element, 33 SubElement, 34 dump, 35 XML) 36 26 37 SAGE_ROOT = os.environ['SAGE_ROOT'] 27 38 DSAGE_LOCAL = SAGE_ROOT + '/local/dsage' 28 CSS_FILE = os.path.join(DSAGE_LOCAL,'web/static/dsage_web.css') 29 SORTTABLE = os.path.join(DSAGE_LOCAL,'web/static/sorttable.js') 30 JS_FILE = os.path.join(DSAGE_LOCAL,'web/static/dsage_web.js') 31 PROTOTYPE = os.path.join(DSAGE_LOCAL,'web/static/prototype.js') 32 INDEX = os.path.join(DSAGE_LOCAL,'web/static/index.html') 33 34 # def create_jobs_table(jdicts): 35 # """ 36 # Returns an HTML table of jobs given a list of job dictionaries. 37 # 38 # """ 39 # 40 # html = """ 41 # <table class='jobs_table' cellspacing='0' padding='5px' border='solid #000 1px'> 42 # <tr class='thead'> 43 # <td>Job ID</td> 44 # <td>Status</td> 45 # <td>Username</td> 46 # <td>Creation Time</td> 47 # <td>Last Update</td> 48 # <td>Priority</td> 49 # </tr> 50 # """ 51 # 52 # for i, jdict in enumerate(jdicts): 53 # html+=""" 54 # <tr class='tr%s' 55 # """ % (i % 2) 56 # html+=""" 57 # <td><a href='get_details?job_id=%s'>%s</a></td> 58 # <td>%s</td> 59 # <td>%s</td> 60 # <td>%s</td> 61 # <td>%s</td> 62 # <td>%s</td> 63 # </tr> 64 # """ % (jdict['job_id'],jdict['job_id'], jdict['status'], 65 # jdict['username'], jdict['creation_time'], 66 # jdict['update_time'], jdict['priority']) 67 # 68 # html += '</table>' 69 # 70 # return html 39 INDEX = os.path.join(DSAGE_LOCAL,'web/index.html') 40 STATIC = os.path.join(DSAGE_LOCAL,'web/static') 41 42 def create_jobs_table(jdicts): 43 """ 44 Returns an HTML table of jobs given a list of job dictionaries. 45 46 """ 47 48 html = """ 49 <thead> 50 <tr> 51 <th>Job ID</th> 52 <th>Status</th> 53 <th>Username</th> 54 <th>Creation Time</th> 55 <th>Last Update</th> 56 <th>Priority</th> 57 </tr> 58 </thead> 59 <tbody> 60 """ 61 62 for i, jdict in enumerate(jdicts): 63 creation_time = jdict['creation_time'].strftime('%F %r') 64 try: 65 update_time = jdict['update_time'].strftime('%F %r') 66 except AttributeError: # This is a fix for older databases. 67 update_time = "N/A" 68 html+=""" 69 <tr class='tr%s' 70 """ % (i % 2) 71 html+=""" 72 <td><a href='#%s' onClick="getJobDetails('%s')">%s</a></td> 73 <td>%s</td> 74 <td>%s</td> 75 <td>%s</td> 76 <td>%s</td> 77 <td>%s</td> 78 </tr> 79 """ % (jdict['job_id'], jdict['job_id'], jdict['job_id'], 80 jdict['status'], 81 jdict['username'], creation_time, 82 update_time, jdict['priority']) 83 html += """</tbody>""" 84 85 return html 71 86 72 87 class Toplevel(resource.Resource): 73 88 addSlash = True 74 # header = """ 75 # <html> 76 # <header> 77 # <link rel="stylesheet" type="text/css" href="dsage_web.css" /> 78 # <scritp src='prototype.js' type='text/javascript'></script> 79 # <script src='dsage_web.js' type='text/javascript'></script> 80 # </header> 81 # <body> 82 # <div id='header'> 83 # <div id='title'><h1>DSAGE Job Status</h1></div> 84 # </div> 85 # """ 86 # 87 # footer = """ 88 # </body> 89 # </html> 90 # """ 91 92 def __init__(self, dsage_server): 89 90 def __init__(self, dsage_server, server_port): 93 91 self.dsage_server = dsage_server 94 self.child_get_details = GetJobDetails(self.dsage_server) 95 self.child_get_jobs = GetJobs(self.dsage_server) 96 92 self.server_port = server_port 93 94 def child_static(self, ctx): 95 return static.File(STATIC) 96 97 def child_get_details(self, ctx): 98 return GetJobDetails(self.dsage_server) 99 100 def child_get_jobs(self, ctx): 101 return GetJobs(self.dsage_server) 102 103 def child_get_server_details(self, ctx): 104 return GetServerDetails(self.dsage_server) 105 106 def child_get_help(self, ctx): 107 return GetHelp() 108 109 def child_worker_files(self, ctx): 110 return static.File(TMP_WORKER_FILES) 111 97 112 def render(self, ctx): 98 jobs = self.dsage_server.jobdb.get_all_jobs() 99 # jobs_html = create_jobs_table(jobs) 100 f = open(INDEX) 101 return http.Response(stream=f.read()) 102 # return http.Response(stream=self.header + jobs_html + self.footer) 103 setattr(Toplevel, 'child_dsage_web.css', static.File(CSS_FILE)) 104 setattr(Toplevel, 'child_dsage_web.js', static.File(JS_FILE)) 105 setattr(Toplevel, 'child_prototype.js', static.File(PROTOTYPE)) 106 setattr(Toplevel, 'child_sorttable.js', static.File(SORTTABLE)) 107 # setattr(Toplevel, 'child_index.html', static.File(INDEX)) 108 113 index = open(INDEX).read() % (socket.getfqdn(), self.server_port) 114 # return static.File(StringIO(index)) 115 return http.Response(stream=index) 116 117 class GetHelp(resource.PostableResource): 118 """ 119 Returns the help page. 120 121 """ 122 123 def render(self, request): 124 return static.File(os.path.join(STATIC, 'README.html')) 125 109 126 class GetJobs(resource.PostableResource): 110 127 """ … … 118 135 119 136 def render(self, request): 120 jdicts = self.dsage_server.jobdb.get_all_jobs()[:10] 121 html = """ 122 <tr class='thead'> 123 <td>Job ID</td> 124 <td>Status</td> 125 <td>Username</td> 126 <td>Creation Time</td> 127 <td>Last Update</td> 128 <td>Priority</td> 129 </tr>""" 130 # if len(jdicts) != len(self.jdicts): 131 # self.jdicts = jdicts 132 for i, jdict in enumerate(jdicts): 133 html+=""" 134 <tr class='tr%s'> 135 """ % (i % 2) 136 html+=""" 137 <td><a href='get_details?job_id=%s'>%s</a></td> 138 <td>%s</td> 139 <td>%s</td> 140 <td>%s</td> 141 <td>%s</td> 142 <td>%s</td> 143 </tr> 144 """ % (jdict['job_id'],jdict['job_id'], jdict['status'], 145 jdict['username'], jdict['creation_time'], 146 jdict['update_time'], jdict['priority']) 147 148 html += '</table>' 149 # else: 150 # pass 151 # xml_stream = self.build_xml(jdicts) 137 try: 138 count = int(request.args['count'][0]) 139 except: 140 count = 10 141 if count == - 1: 142 jdicts = self.dsage_server.jobdb.get_all_jobs() 143 else: 144 jdicts = self.dsage_server.jobdb.get_all_jobs()[:count] 145 146 html = create_jobs_table(jdicts) 152 147 153 148 return http.Response(stream=html) … … 165 160 dump, 166 161 XML) 167 from cStringIO import StringIO168 162 root = Element('jobs') 169 163 … … 187 181 188 182 """ 189 190 header = """ 191 <html> 192 <header> 193 <link rel="stylesheet" type="text/css" href="dsage_web.css" /> 194 <scritp src='prototype.js' type='text/javascript'></script> 195 </header> 196 <body> 197 <div id='header'> 198 <div id='title'><h1>Details for %s</h1></div> 199 </div> 200 """ 201 202 footer = """ 203 </body> 204 </html> 205 """ 206 183 207 184 def __init__(self, dsage_server): 208 185 self.dsage_server = dsage_server … … 212 189 try: 213 190 html = """ 214 <t able class='job_details'>215 <tr class='thead'>216 <t d>Key</td>217 <t d>Value</td>191 <thead> 192 <tr> 193 <th>Key</th> 194 <th>Value</th> 218 195 </tr> 196 </thead> 197 <tbody> 219 198 """ 199 220 200 jdict = self.dsage_server.jobdb.get_job_by_id(job_id) 221 201 if not isinstance(jdict, dict): 222 202 raise TypeError 223 203 for i, (k, v) in enumerate(jdict.iteritems()): 224 if k == 'code': # We will display the code below the table 225 continue 204 # if k == 'code': # We will display the code below the table 205 # continue 206 if k == 'result': # result is an .sobj, link to the file 207 v = "<a href='worker_files/%s'>result.sobj (Click to download.)</a>" % (jdict['job_id'] + '/' + 'result.sobj') 226 208 html += """ 227 209 <tr class='tr%s'> 228 """ % (i % 2) 210 """ % (i % 2) 229 211 html += """ 230 212 <td>%s</td> … … 232 214 </tr> 233 215 """ %(k, v) 234 html += "</table>"216 235 217 html += """ 236 <div id='title'> 237 Job Code 238 </div> 239 <div id='job_code'> 240 %s 241 <div> 242 """ % jdict['code'] 218 </tbody> 219 """ 243 220 except (sqlite3.InterfaceError, TypeError): 244 221 html = 'Invalid job id.' 245 html = self.header % (job_id) + html + self.footer222 246 223 return http.Response(stream=html) 247 224 248 class GetServerDetails(resource. Resource):249 """ 250 Returns an XML file containing the server resources.225 class GetServerDetails(resource.PostableResource): 226 """ 227 Returns an HTML table containing the server resources. 251 228 252 229 """ … … 254 231 def __init__(self, dsage_server): 255 232 self.dsage_server = dsage_server 256 257 def render(self): 233 self.xml_stats = XMLStats(self.dsage_server) 234 235 def gen_html(self): 236 """ 237 generates html snippet from xml stats 238 239 """ 240 241 self.xml_stats.gen_xml() 242 243 html = """ 244 <thead> 245 <tr> 246 <th>Stat</th> 247 <th>Value</th> 248 <tbody>""" 249 250 for i, elem in enumerate(self.xml_stats.root.getchildren()): 251 html += """ 252 <tr> 253 <td>%s</td> 254 <td>%s</td> 255 </tr> 256 """ % (' '.join(w.title() for w in elem.tag.split("_")), 257 elem.text) 258 259 html += """ 260 </tbody> 261 """ 262 263 return html 264 265 def render(self, request): 258 266 """ 259 267 Asks the server to generate stats and returns it in an XML file. 260 268 261 269 """ 262 263 return self.dsage_server.generate_xml_stats()270 271 return http.Response(stream=self.gen_html()) -
sage/libs/pari/gen.pyx
r7355 r8380 4727 4727 return n 4728 4728 4729 def polsturm_full(self): 4730 _sig_on 4731 n = sturmpart(self.g, NULL, NULL) 4732 _sig_off 4733 return n 4734 4729 4735 def polsylvestermatrix(self, g): 4730 4736 t0GEN(g) -
sage/rings/number_field/all.py
r6961 r8379 10 10 11 11 from order import is_NumberFieldOrder, EquationOrder 12 13 from totallyreal import enumerate_totallyreal_fields 14 from totallyreal_data import hermite_constant 15 from totallyreal_dsage import totallyreal_dsage 16 from totallyreal_rel import enumerate_totallyreal_fields_imprim, enumerate_totallyreal_fields_rel -
sage/rings/number_field/number_field_element.pyx
r7355 r8380 594 594 """ 595 595 return self.number_field().complex_embeddings(prec)[i](self) 596 597 def is_totally_positive(self): 598 """ 599 Returns True if self is positive for all real embeddings of 600 its parent number field. We do nothing at complex places, 601 so e.g. any element of a totally complex number field will return 602 True. 603 604 EXAMPLES: 605 sage: F.<b> = NumberField(x^3-3*x-1) 606 sage: b.is_totally_positive() 607 False 608 sage: (b^2).is_totally_positive() 609 True 610 """ 611 for v in self.number_field().real_embeddings(): 612 if v(self) <= 0: 613 return False 614 return True 596 615 597 616 def is_square(self, root=False): -
setup.py
r7388 r8380 773 773 Extension('sage.rings.number_field.number_field_base', 774 774 sources = ['sage/rings/number_field/number_field_base.pyx']), \ 775 776 Extension('sage.rings.number_field.totallyreal_data', 777 ['sage/rings/number_field/totallyreal_data.pyx'], 778 libraries = ['gmp']), 775 779 776 780 Extension('sage.rings.morphism', … … 1205 1209 1206 1210 data_files = [('dsage/web/static', 1207 ['sage/dsage/web/static/dsage_web.css', 1208 'sage/dsage/web/static/dsage_web.js', 1209 'sage/dsage/web/static/jquery-latest.js', 1210 'sage/dsage/web/static/jquery.tablesorter.pack.js', 1211 'sage/dsage/web/static/index.html'])], 1211 ['sage/dsage/web/static/dsage_web.css', 1212 'sage/dsage/web/static/dsage_web.js', 1213 'sage/dsage/web/static/jquery-latest.js', 1214 'sage/dsage/web/static/jquery.tablesorter.pack.js', 1215 'sage/dsage/web/static/jquery.history.js', 1216 'sage/dsage/web/static/asc.gif', 1217 'sage/dsage/web/static/desc.gif', 1218 'sage/dsage/web/static/bg.gif', 1219 'sage/dsage/README.html']), 1220 ('dsage/web/', 1221 ['sage/dsage/web/index.html'])], 1212 1222 1213 1223 ext_modules = ext_modules,
Note: See TracChangeset
for help on using the changeset viewer.
