Compare commits

...

3 Commits

Author SHA1 Message Date
JoYo 42c7364589 minor formatting 2019-02-19 23:04:45 +00:00
JoYo 6a1b056ed9 session add the wrong db entry object fix 2019-02-19 22:56:11 +00:00
JoYo ce4e8b57c5 initial orm for sqlite state 2019-02-19 04:40:35 +00:00
5 changed files with 79 additions and 19 deletions

5
.gitignore vendored
View File

@ -1,2 +1,7 @@
__pycache__/ __pycache__/
seed seed
out/
build/
dist/
*.egg-info/
.vscode

View File

@ -7,5 +7,5 @@ services:
volumes: volumes:
- ${PWD}:/app - ${PWD}:/app
working_dir: /app working_dir: /app
command: python3 -m sins command: python3 -m sins -o out/
# command: yasm seed.asm -o seed # command: yasm seed.asm -o seed

View File

@ -1,3 +1,4 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from .run import sins, generation from .run import sins
# from .orm import SeedNode from .mutation import generation, flip, seed_shell
from .orm import db_config, ScrapNode

View File

@ -1,11 +1,12 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from datetime import datetime from datetime import datetime
from sqlalchemy import Blob, Column, ForeignKey, Integer, String, DateTime, create_engine, exists, desc from hashlib import sha1
from pathlib import Path
from sqlalchemy import LargeBinary, Column, ForeignKey, Integer, String, DateTime, create_engine
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Session, relationship, backref from sqlalchemy.orm import Session, relationship, backref
from sqlalchemy.orm.collections import attribute_mapped_collection from sqlalchemy.orm.collections import attribute_mapped_collection
import logging import logging
from hashlib import sha1
logger = logging.getLogger('sins') logger = logging.getLogger('sins')
now = '{0:%Y%m%dT%H%M%S}'.format(datetime.utcnow()) now = '{0:%Y%m%dT%H%M%S}'.format(datetime.utcnow())
@ -13,7 +14,15 @@ now = '{0:%Y%m%dT%H%M%S}'.format(datetime.utcnow())
Base = declarative_base() Base = declarative_base()
class SeedNode(Base): def db_config(path: Path) -> Session:
engine = create_engine(f'sqlite:///{path.resolve()}', native_datetime=True)
Base.metadata.create_all(engine)
session = Session(engine)
return session
class ScrapNode(Base):
__tablename__ = 'scrap_node'
ctime = Column(DateTime, default=datetime.utcnow) ctime = Column(DateTime, default=datetime.utcnow)
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
length = Column(Integer, default=0) length = Column(Integer, default=0)
@ -21,20 +30,29 @@ class SeedNode(Base):
parent_id = Column(Integer, ForeignKey(id)) parent_id = Column(Integer, ForeignKey(id))
checksum = Column(String) checksum = Column(String)
stdout = Column(String) stdout = Column(String)
image = Column(Blob) image = Column(LargeBinary)
children = relationship( children = relationship(
"SeedNode", "ScrapNode",
cascade="all, delete-orphan", cascade="all, delete-orphan",
backref=backref("parent", remote_side=id), backref=backref("parent", remote_side=id),
collection_class=attribute_mapped_collection('name')) collection_class=attribute_mapped_collection('name'))
def __init__(self, *, child: bytes, parent: SeedNode = None): def __init__(self, *, child: bytes, parent_id: int = None):
if parent: self.parent_id = parent_id
self.parent_id = parent.id
self.image = child self.image = child
self.length = len(child) self.length = len(child)
self.sha1sum
def __repr__(self):
values = {
'checksum': self.checksum,
'length': self.length,
'parent_id': self.parent_id,
'id': self.id,
}
return str(values)
@property @property
def sha1sum(self): def sha1sum(self):

View File

@ -4,9 +4,12 @@ from datetime import datetime
from multiprocessing import Process, Queue from multiprocessing import Process, Queue
from pathlib import Path from pathlib import Path
from queue import Empty from queue import Empty
from sqlalchemy import exists, desc
from tempfile import TemporaryDirectory
import logging import logging
from .mutation import generation, flip, seed_shell from .mutation import generation, flip, seed_shell
from .orm import db_config, ScrapNode
def sins(): def sins():
@ -53,19 +56,49 @@ def sins():
with seed.open('rb') as seed_file: with seed.open('rb') as seed_file:
seed_data = seed_file.read() seed_data = seed_file.read()
logger.info(f'seed:\n{seed_data}') seed = ScrapNode(child=seed_data)
logger.debug(f'seed:\n{seed}')
if args.output:
db_path = Path(f'{args.output}/sins.sqlite')
else:
temp_dir = TemporaryDirectory()
db_path = Path(f'{temp_dir.name}/sins.sqlite')
session = db_config(db_path)
logger.info(f'db_path: {db_path}')
if args.seed:
exists = session.query(ScrapNode).filter(
ScrapNode.checksum == seed.checksum)
if exists:
seed = exists[0]
else:
session.add(seed)
session.commit()
else:
recent = session.query(ScrapNode).order_by(desc('ctime')).first()
if recent:
logger.debug(f'recent:\n{recent}')
seed = recent
parent = seed
queue = Queue() queue = Queue()
while True: while True:
lineage = 0 lineage = 0
seed_flipped = flip(seed_data) scrap = flip(parent.image)
while lineage < args.lineage: while lineage < args.lineage:
logger.info(f'lineage: {lineage}') logger.debug(f'lineage: {lineage}')
result = None result = None
proc = Process(target=generation, args=(queue, seed_flipped)) proc = Process(target=generation, args=(queue, scrap))
proc.start() proc.start()
try: try:
result = queue.get(timeout=1) result = queue.get(timeout=1)
@ -77,7 +110,10 @@ def sins():
lineage += 1 lineage += 1
continue continue
logger.info(f'scrap:\n{seed_flipped}') parent = ScrapNode(child=scrap, parent_id=parent.id)
logger.info(f'result: {result}') parent.length = result
session.add(parent)
session.commit()
logger.info(f'scrap:\n{parent}')
lineage = 0 lineage = 0
seed_flipped = flip(seed_flipped) scrap = flip(parent.image)